之前看了Log4J是如何匹配记录的log等级的的源码,log4J的配置项有很多,要一一的去进行查看log4J是如何应用这些配置项的,今天这篇记录下log4J是如何匹配记录的格式,先上配置,这里展示的是我自己重写的
<appender name="DailyRollingFile" class="com.log.jlogstash.logger.DailySizeRollingFileAppender">
<param name="File" value="${LogDir}/${svr}/${Seq}"/>
<param name="DirectoryPattern" value="yyyyMMdd"/>
<param name="DatePattern" value="'_'yyyyMMddHH'_%02d.log'"/>
<param name="Append" value="true" />
<param name="MaxFileSize" value="20MB" />
<param name="MaxBackupIndex" value="50" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%m%n" />
</layout>
</appender>
实际如果不使用自己重写的的话,可以直接使用log4J提供的appender,如下,具体可以根据自身情况选择
<appender name="DailyRollingFile" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="${LogDir}/${svr}/${Seq}"/>
<param name="DirectoryPattern" value="yyyyMMdd"/>
<param name="DatePattern" value="'_'yyyyMMddHH'_%02d.log'"/>
<param name="Append" value="true" />
<param name="MaxFileSize" value="20MB" />
<param name="MaxBackupIndex" value="50" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%m%n" />
</layout>
</appender>
关于记录log的格式,配置在appender的layout参数中,具体的含义可以自行在网上搜索,我每次用的时候都是去找,因为记不住
那Log4J是怎么怎么使用这个Layout参数的勒?围绕这个问题,还是得回到LogManager的加载过程
在LogManager的加载过程中,会解析文件中的appender,会调用DomConfigurator这个类下的parseAppender的方法将配置文件中的参数加载到appender里面,如下源码
protected Appender parseAppender(Element appenderElement) {
String className = this.subst(appenderElement.getAttribute("class"));
LogLog.debug("Class name: [" + className + ']');
try {
Object instance = Loader.loadClass(className).newInstance();
Appender appender = (Appender)instance;
PropertySetter propSetter = new PropertySetter(appender);
appender.setName(this.subst(appenderElement.getAttribute("name")));
NodeList children = appenderElement.getChildNodes();
int length = children.getLength();
for(int loop = 0; loop < length; ++loop) {
Node currentNode = children.item(loop);
if (currentNode.getNodeType() == 1) {
Element currentElement = (Element)currentNode;
if (currentElement.getTagName().equals("param")) {
this.setParameter(currentElement, propSetter);
} else if (currentElement.getTagName().equals("layout")) {
appender.setLayout(this.parseLayout(currentElement));
} else if (currentElement.getTagName().equals("filter")) {
this.parseFilters(currentElement, appender);
} else if (currentElement.getTagName().equals("errorHandler")) {
this.parseErrorHandler(currentElement, appender);
} else if (currentElement.getTagName().equals("appender-ref")) {
String refName = this.subst(currentElement.getAttribute("ref"));
if (appender instanceof AppenderAttachable) {
AppenderAttachable aa = (AppenderAttachable)appender;
LogLog.debug("Attaching appender named [" + refName + "] to appender named


384

被折叠的 条评论
为什么被折叠?



