使用Log4j2把日志输出到Kafka

技术文档网 2021-04-28
方案简介:

使用Log4j2输出日志;

日志输出到本地和Kafka;

Graylog由Kafka读取日志;

开发人员通过Graylog搜索、读取日志。

1.log4j2.xml

<?xml version="1.0" encoding="UTF-8"?> <!-- status : 这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,会看到log4j2内部各种详细输出 monitorInterval : Log4j能够自动检测修改配置文件和重新配置本身, 设置间隔秒数。 --> <configuration status="off" monitorInterval="1800"> <Properties> <!-- 配置日志文件输出目录 --> <Property name="LOG_HOME">/opt/tomcat/logs</Property> </Properties> <appenders> <Kafka name="Kafka" topic="log-test"> <PatternLayout pattern="%date %message"/> <Property name="bootstrap.servers">192.168.252.130:9092</Property> </Kafka>

    `<!--这个输出控制台的配置-->`
    `<Console name="Console" target="SYSTEM_OUT">`
        `<!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->`
        `<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>`
        `<!-- 输出日志的格式 -->`
        `<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>`
    `</Console>`

    `<!-- 设置日志格式并配置日志压缩格式(service.log.年份.gz) -->`
    `<RollingRandomAccessFile name="service_appender"`
                             `immediateFlush="false" fileName="${LOG_HOME}/service.log"`
                             `filePattern="${LOG_HOME}/service.log.%d{yyyy-MM-dd}.log.gz">`
        `<!--`
            `%d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间`
            `%p : 日志输出格式`
            `%c : logger的名称`
            `%m : 日志内容,即 logger.info("message")`
            `%n : 换行符`
            `%C : Java类名`
            `%L : 日志输出所在行数`
            `%M : 日志输出所在方法名`
            `hostName : 本地机器名`
            `hostAddress : 本地ip地址`
         `-->`
        `<PatternLayout>`
            `<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M -- %msg%xEx%n</pattern>`
        `</PatternLayout>`
        `<Policies>`
            `<TimeBasedTriggeringPolicy interval="1" modulate="true" />`
        `</Policies>`
    `</RollingRandomAccessFile>`


    `<!-- DEBUG日志格式 -->`
    `<RollingRandomAccessFile name="service_debug_appender"`
                             `immediateFlush="false" fileName="${LOG_HOME}/service.log"`
                             `filePattern="${LOG_HOME}/service.log.%d{yyyy-MM-dd}.debug.gz">`
        `<PatternLayout>`
            `<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M -- %msg%xEx%n</pattern>`
        `</PatternLayout>`
        `<Policies>`
            `<TimeBasedTriggeringPolicy interval="1" modulate="true" />`
        `</Policies>`
    `</RollingRandomAccessFile>`
`</appenders>`
`<loggers>       `
    `<!-- 配置日志的根节点 -->`
    `<root level="info">`
        `<appender-ref ref="Kafka" />`
        `<appender-ref ref="Console"/>`
    `</root>`

    `<!-- 第三方日志系统 -->`
    `<logger name="org.springframework.core" level="info"/>`
    `<logger name="org.springframework.beans" level="info"/>`
    `<logger name="org.springframework.context" level="info"/>`
    `<logger name="org.springframework.web" level="info"/>`
    `<logger name="org.jboss.netty" level="warn"/>`
    `<logger name="org.apache.http" level="warn"/>`

    `<!-- 日志实例(info),其中'service-log'继承root,但是root将日志输出控制台,而'service-log'将日志输出到文件,通过属性'additivity="false"'将'service-log'的的日志不再输出到控制台 -->`
    `<logger name="service_log" level="info" includeLocation="true" additivity="true">`
        `<appender-ref ref="service_appender"/>`
    `</logger>`

    `<!-- 日志实例(debug) -->`
    `<logger name="service_log" level="debug" includeLocation="true" additivity="false">`
        `<appender-ref ref="service_debug_appender"/>`
    `</logger>`

    `<Logger name="org.apache.kafka" level="INFO" /> <!-- avoid recursive logging -->`
`</loggers>`

</configuration>

2.maven依赖

注意:2.5以上版本。

    `<dependency>`
        `<groupId>org.apache.logging.log4j</groupId>`
        `<artifactId>log4j-api</artifactId>`
        `<version>2.6.2</version>`
    `</dependency>`
    `<dependency>`
        `<groupId>org.apache.logging.log4j</groupId>`
        `<artifactId>log4j-core</artifactId>`
        `<version>2.6.2</version>`
    `</dependency>`
    `<dependency>`
        `<groupId>org.apache.logging.log4j</groupId>`
        `<artifactId>log4j-web</artifactId>`
        `<version>2.6.2</version>`
    `</dependency>`

log4j2与slf4j集成

        `<dependency>`
            `<groupId>org.slf4j</groupId>`
            `<artifactId>slf4j-api</artifactId>`
            `<version>1.7.21</version>`
        `</dependency>`
        `<dependency>`
            `<groupId>org.apache.logging.log4j</groupId>`
            `<artifactId>log4j-api</artifactId>`
            `<version>2.6.2</version>`
        `</dependency>`
        `<dependency>`
            `<groupId>org.apache.logging.log4j</groupId>`
            `<artifactId>log4j-core</artifactId>`
            `<version>2.6.2</version>`
        `</dependency>`
        `<!-- log4j-slf4j-impl(用于log4j2与slf4j集成) -->`
        `<dependency>`
            `<groupId>org.apache.logging.log4j</groupId>`
            `<artifactId>log4j-slf4j-impl</artifactId>`
            `<version>2.6.2</version>`
        `</dependency>`

3.获取Logger

// log4j2方式 private static final org.apache.logging.log4j.Logger LOG = org.apache.logging.log4j.LogManager.getLogger(Logstrap.class);

// slf4j方式 private static final org.slf4j.Logger LOG = org.slf4j.LoggerFactory.getLogger(LoggerFactory.class);

4.kafka

监听Kafka:

bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic log-test --from-beginning

相关文章

  1. 基于-SLF4J-MDC-机制的日志链路追踪配置属性

    ums: # ================ 基于 SLF4J MDC 机制的日志链路追踪配置属性 ================ mdc: # 是否支持基于 SLF4J MDC

  2. ajax-跨域访问

    ajax 跨域访问 &lt;!DOCTYPE html&gt; &lt;html xmlns:th="http://www.w3.org/1999/xhtml"&gt; &lt;head&gt;

  3. 给第三方登录时用的数据库表-user_connection-与-auth_token-添加-redis-cache

    spring: # 设置缓存为 Redis cache: type: redis # redis redis: host: 192.168.88.88 port

  4. Java动态代理

    Jdk动态代理 通过InvocationHandler和Proxy针对实现了接口的类进行动态代理,即必须有相应的接口 应用 public class TestProxy { public

  5. Java读取classpath中的文件

    public void init() { try { //URL url = Thread.currentThread().getContextClassLo

随机推荐

  1. 基于-SLF4J-MDC-机制的日志链路追踪配置属性

    ums: # ================ 基于 SLF4J MDC 机制的日志链路追踪配置属性 ================ mdc: # 是否支持基于 SLF4J MDC

  2. ajax-跨域访问

    ajax 跨域访问 &lt;!DOCTYPE html&gt; &lt;html xmlns:th="http://www.w3.org/1999/xhtml"&gt; &lt;head&gt;

  3. 给第三方登录时用的数据库表-user_connection-与-auth_token-添加-redis-cache

    spring: # 设置缓存为 Redis cache: type: redis # redis redis: host: 192.168.88.88 port

  4. Java动态代理

    Jdk动态代理 通过InvocationHandler和Proxy针对实现了接口的类进行动态代理,即必须有相应的接口 应用 public class TestProxy { public

  5. Java读取classpath中的文件

    public void init() { try { //URL url = Thread.currentThread().getContextClassLo