log4j2日志接入阿里云日志服务

Producer Library

LogHub Producer Library 是针对应用程序高并发写LogHub类库,Producer Library 和Consumer Library是对LogHub的读写包装,降低数据收集与消费的门槛。

功能特点

  • 提供异步的发送接口,线程安全。
  • 可以添加多个Project的配置。
  • 可以配置用于发送的网络 I/O 线程数量。
  • 可以配置merge成的包的日志数量以及大小。
  • 内存使用可控,当内存使用达到用户配置的阈值时,Producer 的 send 接口会阻塞,直到有空闲的内存可用。

功能优势

  • 客户端日志不落盘:既数据产生后直接通过网络发往服务端。
  • 客户端高并发写入:例如一秒钟会有百次以上写操作。
  • 客户端计算与 IO 逻辑分离:打日志不影响计算耗时。

在以上场景中,Producer Library 会简化您程序开发的代价,帮助您批量聚合写请求,通过异步的方式发往 LogHub 服务端。在整个过程中,您可以配置批量聚合的参数,服务端异常处理的逻辑等。

2612_zh-CN.png

Log4j2 Appender

阿里云的Log4j2 Appender 是基于Java Producer开发,可以控制日志的输出目的地为阿里云日志服务,写到日志服务中的日志的样式如下:

 

level: ERROR
location: com.aliyun.openservices.log.log4j2.example.Log4j2AppenderExample.main(Log4j2AppenderExample.java:16)
message: error log
throwable: java.lang.RuntimeException: xxx
thread: main
time: 2018-01-02T03:15+0000
log: 2018-01-02 11:15:29,682 ERROR [main] com.aliyun.openservices.log.log4j2.example.Log4j2AppenderExample: error log
__source__: xxx
__topic__: yyy

 

其中:

 

  • level 日志级别。
  • location 日志打印语句的代码位置。
  • message 日志内容。
  • throwable 日志异常信息(只有记录了异常信息,这个字段才会出现)。
  • thread 线程名称。
  • time 日志打印时间(可以通过 timeFormat 或 timeZone 配置 time 字段呈现的格式和时区)。
  • log 自定义日志格式(只有设置了 encoder,这个字段才会出现)。
  • __source__ 日志来源,用户可在配置文件中指定。
  • __topic__ 日志主题,用户可在配置文件中指定。

 

添加依赖

<dependency>
 <groupId>com.google.protobuf</groupId>
 <artifactId>protobuf-java</artifactId>
 <version>2.5.0</version>
</dependency>
<dependency>
 <groupId>com.aliyun.openservices</groupId>
 <artifactId>aliyun-log-log4j2-appender</artifactId>
 <version>0.1.9</version>
</dependency>
<dependency>
 <groupId>com.lmax</groupId>
 <artifactId>disruptor</artifactId>
 <version>3.4.2</version>
</dependency>
 

修改log4j配置文件

<Appenders>
    <Loghub name="Loghub"
            projectName="your project"
            logstore="your logstore"
            endpoint="your project endpoint"
            accessKeyId="your accesskey id"
            accessKey="your accesskey"
            packageTimeoutInMS="3000"
            logsCountPerPackage="4096"
            logsBytesPerPackage="3145728"
            memPoolSizeInByte="104857600"
            retryTimes="3"
            maxIOThreadSizeInPool="8"
            topic="your topic"
            source="your source"
            timeFormat="yyyy-MM-dd'T'HH:mmZ"
            timeZone="UTC"
            ignoreExceptions="true">
        <PatternLayout pattern="%d %-5level [%thread] %logger{0}: %msg"/>
    </Loghub>
</Appenders>
<Loggers>
    <Root level="warn">
        <AppenderRef ref="Loghub"/>
    </Root>
</Loggers>
其中: level 是日志记录的优先级,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制应用程序中相应级别的日志信息的开关。比如在这里定义了 WARN 级别,则应用程序中所有 INFO、DEBUG 级别的日志信息将不被打印出来。

参数说明

#日志服务的 project 名,必选参数
projectName = [your project]
#日志服务的 logstore 名,必选参数
logstore = [your logstore]
#日志服务的 HTTP 地址,必选参数
endpoint = [your project endpoint]
#用户身份标识,必选参数
accessKeyId = [your accesskey id]
accessKey = [your accesskey]

#被缓存起来的日志的发送超时时间,如果缓存超时,则会被立即发送,单位是毫秒,默认值为3000,最小值为10,可选参数
packageTimeoutInMS = 3000
#每个缓存的日志包中包含日志数量的最大值,不能超过 4096,可选参数
logsCountPerPackage = 4096
#每个缓存的日志包的大小的上限,不能超过 3MB,单位是字节,可选参数
logsBytesPerPackage = 3145728
#Appender 实例可以使用的内存的上限,单位是字节,默认是 100MB,可选参数
memPoolSizeInByte = 1048576000
#指定I/O线程池最大线程数量,主要用于发送数据到日志服务,默认是8,可选参数
maxIOThreadSizeInPool = 8
#指定发送失败时重试的次数,如果超过该值,会把失败信息记录到log4j2的StatusLogger里,默认是3,可选参数
retryTimes = 3

#指定日志主题,默认为 "",可选参数
topic = [your topic]

#指的日志来源,默认为应用程序所在宿主机的 IP,可选参数
source = [your source]

#输出到日志服务的时间的格式,默认是 yyyy-MM-dd'T'HH:mm:ssZ,可选参数
timeFormat = yyyy-MM-dd'T'HH:mm:ssZ

#输出到日志服务的时间的时区,默认是 UTC,可选参数
timeZone = UTC

增加自定义输出

可以使用org.apache.logging.log4j.ThreadContext将需要记录的值put进去,则该记录会作为单独的元素在阿里云日志上显示

使用如下:

ThreadContext.put("order_no","11");

logger.error("system error");
ThreadContext.clearMap();
阿里云日志服务如下:

image2018-7-25_20-56-11.png?version=1&modificationDate=1532523371000&api=v2

 

参考:https://help.aliyun.com/document_detail/43758.html

http://logging.apache.org/log4j/2.x/manual/thread-context.html

转载于:https://my.oschina.net/u/1421583/blog/1863274

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值