• java 在linux环境下写入 syslog 问题研究


    1.Syslog

    在Unix类操作系统上,syslog广泛应用于系统日志。syslog日志消息既可以记录在本地文件中,也可以通过网络发送到接收syslog的服务器。接收syslog的服务器可以对多个设备的syslog消息进行统一的存储,或者解析其中的内容做相应的处理。常见的应用场景是网

    络管理工具、安全管理系统、日志审计系统。

    2.linux下syslog系统

    syslog是Linux系统默认的日志守护进,内核等一些模块的日志基本上是通过syslog存储的。新版本的ubuntu(不知道具体从哪个版本开始),把syslog扩展到了rsyslog。

    syslog日志最主要的部分是产生日志的程序模块(Facility)和日志等级(Level),其他还有诸如时间、主机ip、进程ID等信息。

    ubuntu下syslog服务的配置文件为: /etc/rsyslog.conf

    打开这个文件,比较有用的部分是:

    #
    # Include all config files in /etc/rsyslog.d/
    #
    $IncludeConfig /etc/rsyslog.d/*.conf

    这句话告诉服务器去哪里读取更详细的配置文件,在/etc/rsyslog.d/文件夹下,有数个详细配置文件。如果想要包含别的路径的配置文件,可以按照类似规则添加。

    在/etc/rsyslog.d/文件夹下有两个文件20-ufw.conf和50-default.conf,在50-default.conf中可以看到有如下部分信息:

    #
    # First some standard log files.  Log by facility.
    #
    auth,authpriv.*                 /var/log/auth.log
    local1.*                        -/var/log/local1.log
    *.*;auth,authpriv.none          -/var/log/syslog
    #cron.*                         /var/log/cron.log
    #daemon.*                       -/var/log/daemon.log
    

    其中的local1.* 代表了前文说的[Facility].[Level]组合。

    Facility代表服务,指定syslog功能,local0~local7 为自定义程序使用,一般应用都选取1~7中的一个作为服务标志。

    Level代表优先级,由高到低为panic, alert, crit, err, warning, notice, info, debug, none。

    后半部分-/var/log/local1.log 表示日志文件的路径。

    cmd语句示例如:logger -p local1.info -t "test" "a test of syslog"。

    3. java写入syslog代码

    在linux环境下,使用logback日志框架连接syslog,xml如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
    
      <appender name="RSYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
        <syslogHost>127.0.0.1</syslogHost>
        <facility>LOCAL1</facility>
        <suffixPattern>%msg</suffixPattern>
      </appender>
    
      <logger name="com.xy.SystemLogger" level="DEBUG">
        <appender-ref ref="RSYSLOG" />
      </logger>
    
    </configuration>
    

     java代码如下:

    static final Logger LOGGER = LoggerFactory.getLogger(SystemLogger.class);
    
     // send to syslog
     LOGGER.info("java[" + pid + "]: " + message);
    

    但是,在syslog日志中没有发现对应语句,java代码没有写入。。。

    请教大牛后,排查过程如下:

    tcpdump -XX -v -i any host 127.0.0.1 and port 514
    tail -f /opt/slk/var/log/SLK.log
    strace -f java -jar target/consumer-1.0-SNAPSHOT.jar
    ps auxwww | grep syslog
    netstat -alp
    ls /proc/pid/

    最后找到原因:syslog在linux中默认使用unix domain socket机制,而java logger使用UDP socket方式无法链接上。

    解决办法是让syslog使用UDP方式,修改/etc/rsyslog.conf:

    # Provides UDP syslog reception
    $ModLoad imudp
    $UDPServerRun 514
  • 相关阅读:
    [luogu2059 JLOI2013] 卡牌游戏 (概率dp)
    [luogu1772 ZJOI2006] 物流运输 (最短路 线性dp)
    [luogu 2568] GCD (欧拉函数)
    [poj 2976] Dropping tests (分数规划 二分)
    cf掉分记——Avito Code Challenge 2018
    新博客的第一篇博文~
    [noip2011 luogu1312] Mayan游戏(模拟)
    bzoj2618 [Cqoi2006]凸多边形
    LLppdd never give up!
    我的scoi2018
  • 原文地址:https://www.cnblogs.com/starRebel/p/5306236.html
Copyright © 2020-2023  润新知