自定义 Log4j2 包装器和输出
custom Log4j2 wrapper and output
我有一个围绕 Log4j2 的自定义包装器。我在输出上有一些问题,在 XXX 行下是我想要的。但是当我使用 "Log.info()" 时,我无法得到相同的结果。除 "Log .getLog().info()"
之外的任何解决方法
这是代码
public class TestMyLog {
public static void main(String[] args){
Log.info("asdasggg");
Log.debug("asdasda");
Log.fatal("asdwefe");
Log.error("fgggg");
Log.warn("sdsdee");
Log.trace("ioimom");
System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
Log.getLog().info("sdss");
Log.getLog().debug("dddddd");
Log.getLog().error("erffs");
}
}
public class Log{
public static Log4j getLog(){
return new Log4j2Wrapper();
}
public static void info(String str){
new Log4j2Wrapper().info(str);
}
public static void debug(String str){
new Log4j2Wrapper().debug(str);
}
public static void error(String str){
new Log4j2Wrapper().error(str);
}
public static void fatal(String str){
new Log4j2Wrapper().fatal(str);
}
public static void trace(String str){
new Log4j2Wrapper().trace(str);
}
public static void warn(String str){
new Log4j2Wrapper().warn(str);
}
public static boolean isInfoEnabled(){
return new Log4j2Wrapper().isInfoEnabled();
}
public static boolean isDebugEnabled(){
return new Log4j2Wrapper().isDebugEnabled();
}
public static boolean isErrorEnabled(){
return new Log4j2Wrapper().isErrorEnabled();
}
public static boolean isFatalEnabled(){
return new Log4j2Wrapper().isFatalEnabled();
}
public static boolean isWarnEnabled(){
return new Log4j2Wrapper().isWarnEnabled();
}
public static boolean isTraceEnabled(){
return new Log4j2Wrapper().isTraceEnabled();
}
}
public class Log4j2Wrapper implements Log4j{
private static final String FQCN = Log4j2Wrapper.class.getName();
private ExtendedLoggerWrapper log;
public Log4j2Wrapper() {
Logger logger = LogManager.getLogger();
log = new ExtendedLoggerWrapper((ExtendedLogger) logger,
logger.getName(), logger.getMessageFactory());
}
public boolean isInfoEnabled() {
return log.isInfoEnabled();
}
public boolean isDebugEnabled() {
return log.isDebugEnabled();
}
public boolean isErrorEnabled() {
return log.isErrorEnabled();
}
public boolean isFatalEnabled() {
return log.isFatalEnabled();
}
public boolean isWarnEnabled() {
return log.isWarnEnabled();
}
public boolean isTraceEnabled() {
return log.isTraceEnabled();
}
public void info(String str) {
log.logIfEnabled(FQCN, Level.INFO, null, new SimpleMessage(str), null);
}
public void info(String str, Throwable t) {
log.logIfEnabled(FQCN, Level.INFO, null, new SimpleMessage(str), t);
}
public void debug(String str){
log.logIfEnabled(FQCN, Level.DEBUG,null,new SimpleMessage(str),null);
}
public void error(String str){
log.logIfEnabled(FQCN, Level.ERROR,null,new SimpleMessage(str),null);
}
public void fatal(String str){
log.logIfEnabled(FQCN, Level.FATAL,null,new SimpleMessage(str),null);
}
public void trace(String str){
log.logIfEnabled(FQCN, Level.TRACE,null,new SimpleMessage(str),null);
}
public void warn(String str){
log.logIfEnabled(FQCN, Level.WARN,null,new SimpleMessage(str),null);
}
}
public interface Log4j {
boolean isInfoEnabled();
boolean isDebugEnabled();
boolean isErrorEnabled();
boolean isFatalEnabled();
boolean isWarnEnabled();
boolean isTraceEnabled();
void info(String str);
void info(String str, Throwable t);
void debug(String str);
void error(String str);
void fatal(String str);
void warn(String str);
void trace(String str);
}
如果您在 log4j2.xml 文件中使用 PatternLayout,我相信此模式会为您提供所需的输出。
pattern="%d{dd HH:mm:ss.SSS} %-5level %-10logger{2} %-10M() ] %msg%n" />
https://logging.apache.org/log4j/2.x/manual/configuration.html#Loggers
如果您想编写自定义 Logger 包装器,则很难正确获取位置信息,因为 Log4j2 遍历堆栈跟踪许多步骤以找到该位置,并且您的包装器添加了一个额外的 StacktraceElement。
我建议您使用 Log4j2 工具创建自定义包装器:查看 manual page for custom log levels。此工具可以为正确处理位置信息的自定义记录器生成代码。
P.S。
请注意,遍历堆栈跟踪以查找日志记录位置在性能方面非常昂贵。 async logging page 有一些具体数字。这就像每条日志消息都抛出一个异常。
我有一个围绕 Log4j2 的自定义包装器。我在输出上有一些问题,在 XXX 行下是我想要的。但是当我使用 "Log.info()" 时,我无法得到相同的结果。除 "Log .getLog().info()"
之外的任何解决方法这是代码
public class TestMyLog {
public static void main(String[] args){
Log.info("asdasggg");
Log.debug("asdasda");
Log.fatal("asdwefe");
Log.error("fgggg");
Log.warn("sdsdee");
Log.trace("ioimom");
System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
Log.getLog().info("sdss");
Log.getLog().debug("dddddd");
Log.getLog().error("erffs");
}
}
public class Log{
public static Log4j getLog(){
return new Log4j2Wrapper();
}
public static void info(String str){
new Log4j2Wrapper().info(str);
}
public static void debug(String str){
new Log4j2Wrapper().debug(str);
}
public static void error(String str){
new Log4j2Wrapper().error(str);
}
public static void fatal(String str){
new Log4j2Wrapper().fatal(str);
}
public static void trace(String str){
new Log4j2Wrapper().trace(str);
}
public static void warn(String str){
new Log4j2Wrapper().warn(str);
}
public static boolean isInfoEnabled(){
return new Log4j2Wrapper().isInfoEnabled();
}
public static boolean isDebugEnabled(){
return new Log4j2Wrapper().isDebugEnabled();
}
public static boolean isErrorEnabled(){
return new Log4j2Wrapper().isErrorEnabled();
}
public static boolean isFatalEnabled(){
return new Log4j2Wrapper().isFatalEnabled();
}
public static boolean isWarnEnabled(){
return new Log4j2Wrapper().isWarnEnabled();
}
public static boolean isTraceEnabled(){
return new Log4j2Wrapper().isTraceEnabled();
}
}
public class Log4j2Wrapper implements Log4j{
private static final String FQCN = Log4j2Wrapper.class.getName();
private ExtendedLoggerWrapper log;
public Log4j2Wrapper() {
Logger logger = LogManager.getLogger();
log = new ExtendedLoggerWrapper((ExtendedLogger) logger,
logger.getName(), logger.getMessageFactory());
}
public boolean isInfoEnabled() {
return log.isInfoEnabled();
}
public boolean isDebugEnabled() {
return log.isDebugEnabled();
}
public boolean isErrorEnabled() {
return log.isErrorEnabled();
}
public boolean isFatalEnabled() {
return log.isFatalEnabled();
}
public boolean isWarnEnabled() {
return log.isWarnEnabled();
}
public boolean isTraceEnabled() {
return log.isTraceEnabled();
}
public void info(String str) {
log.logIfEnabled(FQCN, Level.INFO, null, new SimpleMessage(str), null);
}
public void info(String str, Throwable t) {
log.logIfEnabled(FQCN, Level.INFO, null, new SimpleMessage(str), t);
}
public void debug(String str){
log.logIfEnabled(FQCN, Level.DEBUG,null,new SimpleMessage(str),null);
}
public void error(String str){
log.logIfEnabled(FQCN, Level.ERROR,null,new SimpleMessage(str),null);
}
public void fatal(String str){
log.logIfEnabled(FQCN, Level.FATAL,null,new SimpleMessage(str),null);
}
public void trace(String str){
log.logIfEnabled(FQCN, Level.TRACE,null,new SimpleMessage(str),null);
}
public void warn(String str){
log.logIfEnabled(FQCN, Level.WARN,null,new SimpleMessage(str),null);
}
}
public interface Log4j {
boolean isInfoEnabled();
boolean isDebugEnabled();
boolean isErrorEnabled();
boolean isFatalEnabled();
boolean isWarnEnabled();
boolean isTraceEnabled();
void info(String str);
void info(String str, Throwable t);
void debug(String str);
void error(String str);
void fatal(String str);
void warn(String str);
void trace(String str);
}
如果您在 log4j2.xml 文件中使用 PatternLayout,我相信此模式会为您提供所需的输出。
pattern="%d{dd HH:mm:ss.SSS} %-5level %-10logger{2} %-10M() ] %msg%n" />
https://logging.apache.org/log4j/2.x/manual/configuration.html#Loggers
如果您想编写自定义 Logger 包装器,则很难正确获取位置信息,因为 Log4j2 遍历堆栈跟踪许多步骤以找到该位置,并且您的包装器添加了一个额外的 StacktraceElement。
我建议您使用 Log4j2 工具创建自定义包装器:查看 manual page for custom log levels。此工具可以为正确处理位置信息的自定义记录器生成代码。
P.S。 请注意,遍历堆栈跟踪以查找日志记录位置在性能方面非常昂贵。 async logging page 有一些具体数字。这就像每条日志消息都抛出一个异常。