log4j使用SocketAppender推送日志到远程服务器(包含log4j如何升级到log4j2,并使用SocketAppender发送日志到LogStash)

    因为项目要接入到公司的统一日志管理平台ELK (ElasticSearch + Logstash + Kibana,所以需要将日志发送到远程服务器,查找了一些资料,log4j,logback等都能实现,由于项目中已经使用了log4j,所以决定使用log4j的来实现。

    网上相关的资料都挺多,但是没有看到很全面的,博主根据几天的实际动手经验以及一些其他博客,进行归纳总结。

    log4j向远程发送日志是通过SocketAppender,一个基于socket的Appender程序(TCP协议通信),它不会对日志消息做任何的处理,仅仅是通过socket将日志发送到特定的服务器上。在SocketAppender中,只是简单的把LoggingEvent对象直接通过序列化的方式发送到套接字的输出流上。

    前提是日志服务器已搭建好,只需要提供IP和端口号即可,logstash直接就能获取到日志。

    以下是Log4j的属性配置文件示例:

log4j.rootLogger = INFO,Console,RollingFile,ElkLog

#Console
log4j.appender.Console = org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern =%d%-5p [%c {5 }] - %m%n

#RollingFile
log4j.appender.RollingFile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.RollingFile.File = .. / logs / safe4j / log.log
log4j.appender.RollingFile.layout = org。 apache.log4j.PatternLayout
log4j.appender.RollingFile.layout.ConversionPattern =%d [%t]%-5p [%c] - %m%n

#ElkLog
log4j.appender.ElkLog = org.apache.log4j.net.SocketAppender
log4j.appender.ElkLog.RemoteHost = 10.91.123.123000 
log4j.appender.ElkLog.port = 105143000 
log4j.appender.ElkLog.ReconnectionDelay = 10000

log4j.appender.ElkLog.LocationInfo =真

在JAVA代码中:直接运行为

需要注意的是,由于log4j的中的SocketAppender的英文直接通过序列化的方式发送到服务器,logstash收到的会是一堆二进制乱码:

因此需要在 logstash中使用log4j的插件,即在输入中:

input {
    log4j {
        host=>"localhost"
        port=>4560
    }
}

以上就是使用log4j向logstash推送日志的方法,由于logstash即将停止维护log4j,也不推荐使用log4j插件,因此我又对项目日志进行升级,将log4j 1.x升级到log4j 2.x.升级方法可以不需要修改任何日志打印的代码。

1.首先需要删除对log4j 1.x的jar依赖:例如log4j,slf4j-log4j12等1.x版本的,一定不要漏了。

可以这样查看是否还有log4j 1.x的相关jar:

2.添加log4j 2.x的jar依赖(由于我们使用了slf4j,不需要的则不引用相关jar即可)

3.log4j2是使用xml文件进行日志配置,示例:

<?xml version="1.0" encoding="UTF-8"?>
  <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
  <!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
  <!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
  <configuration status="WARN" monitorInterval="30">
      <!--先定义所有的appender-->
      <appenders>
      <!--这个输出控制台的配置-->
          <console name="Console" target="SYSTEM_OUT">
         <!--输出日志的格式-->
             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
         </console>
     <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
     <File name="log" fileName="log/test.log" append="false">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
     </File>
     <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
         <RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log"
                      filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
             <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->        
             <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
             <Policies>
                 <TimeBasedTriggeringPolicy/>
                 <SizeBasedTriggeringPolicy size="100 MB"/>
             </Policies>
         </RollingFile>
         <RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log"
                      filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
             <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
             <Policies>
                 <TimeBasedTriggeringPolicy/>
                 <SizeBasedTriggeringPolicy size="100 MB"/>
             </Policies>
         <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
             <DefaultRolloverStrategy max="20"/>
         </RollingFile>
         <RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log"
                      filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
             <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
             <Policies>
                 <TimeBasedTriggeringPolicy/>
                 <SizeBasedTriggeringPolicy size="100 MB"/>
             </Policies>
         </RollingFile>
     </appenders>
     <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
     <loggers>
         <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
         <logger name="org.springframework" level="INFO"></logger>
         <logger name="org.mybatis" level="INFO"></logger>
         <root level="all">
             <appender-ref ref="Console"/>
             <appender-ref ref="RollingFileInfo"/>
             <appender-ref ref="RollingFileWarn"/>
             <appender-ref ref="RollingFileError"/>
         </root>
     </loggers>
 </configuration>

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值