Producer Library
LogHub Producer Library 是针对应用程序高并发写LogHub类库,Producer Library 和Consumer Library是对LogHub的读写包装,降低数据收集与消费的门槛。
功能特点
- 提供异步的发送接口,线程安全。
- 可以添加多个Project的配置。
- 可以配置用于发送的网络 I/O 线程数量。
- 可以配置merge成的包的日志数量以及大小。
- 内存使用可控,当内存使用达到用户配置的阈值时,Producer 的 send 接口会阻塞,直到有空闲的内存可用。
功能优势
- 客户端日志不落盘:既数据产生后直接通过网络发往服务端。
- 客户端高并发写入:例如一秒钟会有百次以上写操作。
- 客户端计算与 IO 逻辑分离:打日志不影响计算耗时。
在以上场景中,Producer Library 会简化您程序开发的代价,帮助您批量聚合写请求,通过异步的方式发往 LogHub 服务端。在整个过程中,您可以配置批量聚合的参数,服务端异常处理的逻辑等。
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();
阿里云日志服务如下:
参考:https://help.aliyun.com/document_detail/43758.html
http://logging.apache.org/log4j/2.x/manual/thread-context.html