使用 Groovy 或 Java 将日志发送到 Syslog 服务器

Posted

技术标签:

【中文标题】使用 Groovy 或 Java 将日志发送到 Syslog 服务器【英文标题】:Sending Logs to Syslog Servers using Groovy or Java 【发布时间】:2015-11-19 14:57:22 【问题描述】:

日志来自 POSTGRESQL,我也在使用 Script Runner 来实现它。我一直在寻找将这些日志发送到 syslog 服务器的方法,因为我真的很陌生,我不知道从哪里开始。

假设这是服务器的名称:syslog12 和端口:514

如果有人能教我如何将日志发送到系统日志服务器,我将不胜感激。

这是我的 groovy 代码:

return getUserId()

class Logs
                    String id = ""
                    String created = ""
                    String summary =""
                    String category =""
                    String searchField =""
     String toString()
        "$id ==== $created-$summary,$category,$searchField"    
     


def getUserId()
        def driver = Class.forName('org.postgresql.Driver').newInstance() as Driver
        def props = new Properties()

        props.setProperty("user", "USERNAME")
        props.setProperty("password", "PASSWORD")
        props.setProperty("sslfactory", "org.postgresql.ssl.NonValidatingFactory")
        props.setProperty("ssl", "true")

        def conn = driver.connect("jdbc:postgresql://DATABASE:PORT/GRP", props)
        def sql = new Sql(conn)

        try 

                BufferedWriter outputFile = new BufferedWriter(new FileWriter("/GRP/atlassian/testProd1.txt", true))
                def logs = new Logs()
                String query = "SELECT * from audit_log where created >='2015-04-15' AND created < '2015-04-26' order by id ASC"

                PreparedStatement statement = conn.prepareStatement(query)

                ResultSet result = statement.executeQuery()

                while(result.next())
                        String id1 = result.getString("id")
                        logs.id = id1

                        String created1 = result.getString("created")
                        logs.created = created1

                        String summary1 = result.getString("summary")
                        logs.summary = summary1

                        String category1 = result.getString("category")
                        logs.category = category1

                        String searchField1 = result.getString("search_field")
                        logs.searchField = searchField1

                        outputFile.write("[GRP2.0] "+logs.toString())
                        outputFile.newLine()
                

                outputFile.close()
                return ("[GRP2.0] "+logs.toString())
         finally 
            sql.close()
            conn.close()
        


【问题讨论】:

blog.trifork.com/2010/01/14/… 【参考方案1】:

Logback 有一个非常方便的syslog appender。因为它可以是configured with groovy,所以一个简单的例子真的很简单:

Example.groovy

package com.jalopaba.syslog

import org.slf4j.Logger
import org.slf4j.LoggerFactory

class Example 
    private static final Logger LOG = LoggerFactory.getLogger(Example.class)

    static void main(args) 
        LOG.info('Test message: ' + new Date())
    

logback.groovy

appender('console', ConsoleAppender) 
    encoder(PatternLayoutEncoder) 
        pattern = "%dHH:mm:ss.SSS %-5level [%thread] - %msg%n"
    


appender('syslog', SyslogAppender) 
    syslogHost = 'remote_host'
    facility = 'USER'
    suffixPattern = "%thread: %-5level %logger36 - %msg%n"


logger('com.jalopaba', DEBUG, ['console', 'syslog'])

这样:

remote_host:~$ tail -f /var/log/syslog
Nov 20 12:35:58 jalopaba_machine main: INFO  com.jalopaba.syslog.Example - Test message: Fri Nov 20 12:35:58 CET 2015#015

请记住,syslog/rsyslog 通常默认未启用远程日志记录:What's wrong with my logback syslog appender?

【讨论】:

嗨,我只是想知道端口放在哪里以及它是UDP还是TCP? 如果未指定,端口是 syslog 默认值 (514)。如果你想改变它,SyslogAppender 有一个port 属性(查看文档)。 AFAIK,logback 的 syslog appender 使用 UDP。 我对模式和后缀模式有点困惑,因为我正在学习如何在上面的代码中实现这一点 “由于 syslog 请求的格式遵循相当严格的规则,因此没有可用于 SyslogAppender 的布局。但是,使用 suffixPattern 选项可以让用户显示任何信息。”

以上是关于使用 Groovy 或 Java 将日志发送到 Syslog 服务器的主要内容,如果未能解决你的问题,请参考以下文章

使用 pom 将 Maven 输出发送到控制台和日志文件

如何使用 Java 调用 Groovy 或 Scala UDF 来更新 Oracle?

获得使用 Java 或 Groovy 填充的有效 oauth_signature 的绝对最少代码?

获得使用 Java 或 Groovy 填充的有效 oauth_signature 的绝对最少代码?

如何将json脚本作为文件发送到groovy

Logstash docker,如何停止将日志发送到标准输出