package demo;
import java.io.IOException;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Logdemo {
private final static Logger logger = LogManager.getLogger();
private final static Logger userLog = LogManager.getLogger("demo.userMsg");
public static void main(String[] args) throws IOException {
try {
((Object) null).toString();
} catch (Exception e) {
logger.error("error message", e);
}
try {
((Object) null).toString();
} catch (Exception e) {
logger.fatal( "User level Red message" ,e);
}
try {
((Object) null).toString();
} catch (Exception e) {
userLog.error( "User level Amber message" ,e);
}
logger.info("Errors Logged");
userLog.info("Lunch is served.");
}
}
<Loggers>
<Root level="all">
<AppenderRef ref="RollingFile" level="ALL"/>
<AppenderRef ref="Console" level="ALL"/>
</Root>
<userMsg name="demo.userMsg" level = "all">
<AppenderRef ref="UserMsgFile" level="ALL"/>
</userMsg>
</Loggers>
</Configuration>
由此我从NetBeans得到以下错误消息:
run:
2017-09-18 22:20:13,933 main ERROR Error processing element UserMsgFile [Appenders: null]): CLASS_NOT_FOUND
2017-09-18 22:20:13,936 main ERROR Error processing element userMsg ([Loggers: null]): CLASS_NOT_FOUND
22:20:14.038 [main] INFO demo.Logdemo - logger starting...
22:20:14.040 [main] ERROR demo.Logdemo - error message
所有异常消息都写入控制台,包括用户日志的消息。所以我知道两个伐木工都在工作。记录器附加器写入文件OK。userLog记录器不会创建任何文件,它使用几乎相同的附加器。
看来我还没有正确地命名一些东西来允许log4j2找到记录器。我试过各种命名的组合来弄对它,但我搞不清问题出在哪里。
<Loggers>
<Logger name="demo" level="all"> <!-- name = package name -->
<AppenderRef ref="UserLogFile" level="ALL" />
</Logger>
<Root level="all">
<AppenderRef ref="Console" level="ALL"/>
<AppenderRef ref="SystemLogFile" level="ALL"/>
</Root>
</Loggers>
我必须在每个类的记录器初始化中包含类名吗?
编辑:我需要包含包名。我花了一段时间才弄明白。
我遇到的另一个问题是为log4j2打开调试消息。这是通过以下方式实现的:
<Configuration status="WARN"> <!-- to debug, set status="TRACE" -->
我已经改变了我的方法。我使用了标记功能,并添加了记录器。向日志消息添加标记允许我使用不同的附加器来处理用户消息。示例代码如下所示:
import java.io.IOException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.MarkerManager;
import org.apache.logging.log4j.Marker;
public class Logdemo {
private final static Logger logger = LogManager.getLogger();
static final Marker usrMkr = MarkerManager.getMarker("USR");
public static void main(String[] args) throws IOException {
logger.info("logger starting...");
try {
((Object) null).toString();
} catch (Exception e) {
logger.fatal( usrMkr,"User message" );
}
try {
((Object) null).toString();
} catch (Exception e) {
logger.debug( "Debug error message" ,e);
}
logger.info("Errors Logged");
}
}
配置文件的相关部分如下所示:
<RollingFile
name="UserLogFile"
fileName="${basePath}/UserMsg.log"
immediateFlush="false"
filePattern="logs/$${date:yyyy-MM}/user-%d{MM-dd-yyyy}-%i.log">
<MarkerFilter marker="USR" onMatch="ACCEPT" onMismatch="DENY"/>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="demo" level="all">
<AppenderRef ref="UserLogFile" level="ALL"/>
</Logger>
<Root level="all">
<AppenderRef ref="Console" level="ALL"/>
<AppenderRef ref="RollingFile" level="ALL"/>
</Root>
</Loggers>
我创建了一个添加了MarkerFilter命令的追加器。我将记录器指向appender,以便将标记的消息转移到一个单独的文件。注为了简洁起见,我砍掉了xml文件的大块。
上面是log4j2的一个片段。xml配置文件,我想将其转换为属性。 问题是当我在同一个文件(属性)中定义多个记录器时,只有根记录器工作,这意味着改变其他记录器的级别不会做任何事情。 在同一个属性配置文件中定义多个记录器的正确方法是什么? 编辑: 这是我尝试过的属性配置,但不起作用。
我定义了多个记录器,如下所示(com.xyz和org.xyz)。Log4j2忽略了第一个记录器定义,只加载第二个。在示例中,org.xyz未加载。 在log4j2调试消息下方查找。 我的配置正确吗?
我想让一些记录器异步在log4j2.properties文件。在xml格式中,您可以添加为 我在log4j2中试过了。作为记录器的属性=com foo Bar 但这种语法似乎是错误的。 正确的配置方法是什么?
我正在使用log4j在我的一个应用程序上做一些日志记录。我的配置文件中的日志记录程序如下所示。 基本上,我希望从我写的代码中获得“信息”级别的消息,但是我希望外部库只在有警告或更可怕的情况下记录。 这正如我所期望的那样工作,但是在“org.eclipse.jetty”下有很多类 有可能这样做吗? 也就是说,我希望整个包中的所有内容都只警告/错误/致命。 我试了上述方法,但没有效果。是否有一个“通配
因此,我希望使用CI活动记录获得最终输出,作为产品列表及其详细信息。