由于日志管理需要整合到统一的日志管理平台,所以集群部署的多台服务器日志会冲突,老板要求在日志路径及日志文件中加上服务器IP加以区分,此为前要。
首先说一下为什么不用MDC赋值来操作:MDC赋值其实也可以达到区分路劲和在文件中加Ip的目的,但是代码倾入大,需要动底层框架上已经封装好的业务jar包,因此首先pass。
百度后有大神说整一个logback自定义格式转换器,也就是继承ClassicConverter,实现他的convert方法,然后配置在xml中配置conversionRule标签,即可获取自定义的值,亲测后发现该方式只能在文件中(Pattern)获取到自定义的值,而路径中(FileNamePattern)无法获取到值,创建的路径为***/%PARSER_ERROR[***]/***,因此该方式不能满足需求。但是该方式文件中使用还是方便的,因此附上我自己的实现;
// 新建java类
package *****.****.util.logback;
import ch.qos.logback.classic.pattern.ClassicConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* 该工具类用于在logback中通过%IP获取节点IP地址(日志文件内容),该类需要配置在logback中conversionRule标签
*/
public class NodeIpConverter extends ClassicConverter {
private static String nodeIP;
static {
try {
nodeIP = InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
@Override
public String convert(ILoggingEvent event) {
return nodeIP;
}
}
// logback.xml添加以下配置,该配置位于configuration标签下
<conversionRule conversionWord="nodeIp" converterClass="***.***.util.logback.NodeIpConverter"/>
该方式引用时为 %nodeIp
一路不同再找一路,再次寻求度娘,发现通过自定义全局属性可以实现在路径中动态获取IP值,柳暗花明啊,而且经过测试发现该方式不仅可以在路径(FileNamePattern)中动态获取服务器IP,同时日志输出文件中(Pattern)也可以使用,下面奉上代码:
// 新建java类继承PropertyDefinerBase,重写getPropertyValue方法
package ***.***.util.logback;
import java.net.InetAddress;
import java.net.UnknownHostException;
import ch.qos.logback.core.PropertyDefinerBase;
/**
* 该工具类用于在logback中通过%IP获取节点IP地址(日志文件路劲),该类需要配置在logback中conversionRule标签
*/
public class NodeIpProperty extends PropertyDefinerBase {
private static String nodeIP;
static {
try {
nodeIP = InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
@Override
public String getPropertyValue() {
return NodeIpProperty.nodeIP;
}
}
//logback.xml中添加如下配置,该配置位于configuration标签下
<define name="NODE_IP" class="***.***.util.logback.NodeIpProperty"/>
该方式引用时为 ${NODE_IP}
以上,不是什么新东西,只是在实际工作中遇到的坑,希望能帮到遇到同样问题的伙伴