【转载】logback 中打印自定义参数 (ip 服务名)
转载自
由于应用日志被类似ELK的框架收集到了统一的日志管理平台,所以集群部署的多台服务器日志会冲突,老板希望在打印的日志内容中加上服务器IP加以区分,以此为前提。
一、解决方案
1.1 ClassicConverter实现类
我们创建一个类 com.xxx.utils.IPConverterConfig
并继承 ch.qos.logback.classic.pattern.ClassicConverter
,内容如下:
package com.xxx.utils;
import ch.qos.logback.classic.pattern.ClassicConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* 功能描述: 将ip打印到日志
*
* @author geekziyu
* @version 1.0.0
*/
public class IPConverterConfig extends ClassicConverter {
// 每次 log.info() 都会调用该 converter,所以缓存一下服务器ip
private String cache;
@Override
public String convert(ILoggingEvent event) {
if (cache != null) {
return cache;
}
String result = "unknown";
try {
result = InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
e.printStackTrace();
}
cache = result;
return result;
}
}
1.2 标签
在 logback.xml
中加入
1.3 修改打印格式:
继续修改 logback.xml
中的
-
-
:
%date{yyyy-MM-dd HH:mm:ss.SSS} [%ip] %level [%thread] %logger{36}%msg%n
注意,打印时用 %ip 来表示该变量。
二、测试效果
2.1 logback.xml
以打印日志到Console为例:
<?xml version="1.0" encoding="UTF-8"?>
%date{yyyy-MM-dd HH:mm:ss.SSS} [%ip] %level [%thread] %logger{36} %msg%n
2.2 测试类Main
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger log = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
log.info("Hello World!");
}
}
2.3 运行结果
三、补充
3.1 日志文件的配置
以下 logback.xml
是写入文件的代码:
<?xml version="1.0" encoding="UTF-8"?>
${LOG_PATH}/biz.log
/opt/app/logs/logback/biz-%d{yyyy-MM-dd_HH}.%i.txt
100MB
60
1GB
%date{yyyy-MM-dd HH:mm:ss.SSS} [%ip] %level [%thread] %logger{36} %msg%n
256
0