问题描述
好吧,我试图制作一个内存的appender(简单的记录器,将记录到arraylist而不是控制台或文件),但是现在我想将其禁用到打印到控制台.
问题和网站,我已经阅读了到目前为止(但我仍然无法弄清楚).
- stackoverflow问题log4j:log log4j:特定的特定班级
- stackoverflow问题log4j:disable log4j console log4j console logging and enable文件记录记录记录
- 编码器启动:log4j:log4j:停止登录到console
它具有有关我要实现的目标的所有片段,但我仍然有点困惑.
但是,如果Logger X的Aditivity标志设置为false或disabled,则调用x.debug()只会登录到文件.
因此,从理论上讲,我的log4j.properties文件
log4j.rootLogger=ERROR, console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d %5p %c (%F:%L) - %m%n #hide the Log4jMemoryAppender from console log4j.logger.nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppender= ERROR, MEMORY_APPENDER log4j.appender.MEMORY_APPENDER=nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppender.Log4jMemoryAppender log4j.additivity.rootLogger = false log4j.additivity.console = false log4j.additivity.MEMORY_APPENDER=false
应仅打印***Hello World,并从MEMORY_APPENDER,rootLogger和console中排除其他任何内容.
package nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppender; import java.util.ArrayList; import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.spi.LoggingEvent; import org.apache.log4j.BasicConfigurator; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; public class Log4jMemoryAppender extends AppenderSkeleton { ArrayList<LoggingEvent> eventsList = new ArrayList(); public static void main (String [] args) { PropertyConfigurator.configure("Lib/log4j.properties"); Log4jMemoryAppender app = new Log4jMemoryAppender(); Logger logger = Logger.getLogger(Log4jMemoryAppender.class); logger.setLevel(Level.INFO); logger.addAppender(app); logger.info("Hello World"); logger.debug("Level DEBUG Is SET"); for (LoggingEvent le: app.eventsList) { System.out.println("***" + le.getMessage()); } } @Override protected void append(LoggingEvent event) { eventsList.add(event); } public void close() { } public boolean requiresLayout() { return false; } }
但不是...
(来源: iforce.co.nz )
推荐答案
线
MEMORY_APPENDER=false
将行不通,您无法将appender设置为具有false的值.
在您的情况下,最好做类似的事情:
log4j.rootLogger=ERROR, console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.logger.nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppender = ERROR, MEMORY_APPENDER log4j.additivity.nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppender = false
您的示例之一中使用的记录器是nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppender,它应该映射到log4j.properties中的记录器或仅像nz.ac.massey.cs.sdc.log4jassignment一样的包装部分.
似乎您在这里混合很多. Log4jMemoryAppender您的MEMORY_APPENDER是否?
,为什么要打电话BasicConfigurator.configure()?您不想使用log4j.properties?
通常在课堂上您这样做以获取一个记录器:
package com.mycompany; public class MyClass { private static final Logger log = Logger.getLogger(MyClass.class); ... }
记录器名称将是完全合格的className com.mycompany.MyClass.
然后您可以拥有这样的log4j.properties:
log4j.rootLogger=ERROR, console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.logger.com.mycompany=INFO, file log4j.additivity.com.mycompany=false logfj.appender.file = <some file appender>
好,从头开始. A 非常简单示例.
src/main/java/Log4JTest.java
package org.stackoverflow; import org.apache.log4j.Logger; /** * @author maba, 2012-08-22 */ public class Log4JTest { public static final Logger log = Logger.getLogger(Log4JTest.class); public static void main(String[] args) { log.error("Error in main"); } }
src/main/resources/log4j.properties
log4j.rootLogger = ERROR, console log4j.appender.console = org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
现在编译并确保log4j.properties在运行时与log4j.jar和您自己的类一起在您的类路径中.
您会看到这个:
0 [main] ERROR org.stackoverflow.Log4JTest - Error in main
从这里您可以尝试添加文件Appender或您自己的内存Appender.
其他推荐答案
我刚刚通过在log4j.xml上设置此问题,替换值=" trace"为value =" error".希望这可以帮助一些:)
<root> <priority value="ERROR" /> <appender-ref ref="STDOUT"/> </root>
问题描述
Okay so I'm trying to make a memory appender (simply a logger, that logs to an ArrayList instead of the console or to a file) but for now I want to disable it from printing to the console.
The questions and websites, I've read so far (but I still cant figure it out is)..
- StackOverFlow Question log4j: Log output of a specific class to a specific appender
- StackOverFlow Question log4j : Disable log4j console logging and enable file logging
- Coder Launch: log4j: stop logging to console
It has all the segments on what I'm trying to achieve, but I'm still kind of confused.
I also read this segment from Logback or Log4j Additivity Explained Which states..
If the aditivity flag of logger X however is set to false, or disabled, then calling x.debug() will only log to the file.
So in theory my log4j.properties file
log4j.rootLogger=ERROR, console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d %5p %c (%F:%L) - %m%n #hide the Log4jMemoryAppender from console log4j.logger.nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppender= ERROR, MEMORY_APPENDER log4j.appender.MEMORY_APPENDER=nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppender.Log4jMemoryAppender log4j.additivity.rootLogger = false log4j.additivity.console = false log4j.additivity.MEMORY_APPENDER=false
Should only print ***Hello World and exclude anything else from the MEMORY_APPENDER, rootLogger and console.
package nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppender; import java.util.ArrayList; import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.spi.LoggingEvent; import org.apache.log4j.BasicConfigurator; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; public class Log4jMemoryAppender extends AppenderSkeleton { ArrayList<LoggingEvent> eventsList = new ArrayList(); public static void main (String [] args) { PropertyConfigurator.configure("Lib/log4j.properties"); Log4jMemoryAppender app = new Log4jMemoryAppender(); Logger logger = Logger.getLogger(Log4jMemoryAppender.class); logger.setLevel(Level.INFO); logger.addAppender(app); logger.info("Hello World"); logger.debug("Level DEBUG Is SET"); for (LoggingEvent le: app.eventsList) { System.out.println("***" + le.getMessage()); } } @Override protected void append(LoggingEvent event) { eventsList.add(event); } public void close() { } public boolean requiresLayout() { return false; } }
But it doesn't...
(source: iforce.co.nz)
推荐答案
The line
MEMORY_APPENDER=false
will not work, you cannot set an appender to have the value false.
In you case better do something like this:
log4j.rootLogger=ERROR, console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.logger.nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppender = ERROR, MEMORY_APPENDER log4j.additivity.nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppender = false
The Logger being used in one of your example is nz.ac.massey.cs.sdc.log4jassignment.s06005586.MemoryAppender and that should map to a logger in the log4j.properties or just the package part like nz.ac.massey.cs.sdc.log4jassignment.
It seems like you are mixing a lot here. Is Log4jMemoryAppender your MEMORY_APPENDER or not?
And why are you calling BasicConfigurator.configure()? Don't you want to use the log4j.properties?
Normally in a class you do this to get a logger:
package com.mycompany; public class MyClass { private static final Logger log = Logger.getLogger(MyClass.class); ... }
The logger name will be the fully qualified classname com.mycompany.MyClass.
Then you can have a log4j.properties like this:
log4j.rootLogger=ERROR, console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.logger.com.mycompany=INFO, file log4j.additivity.com.mycompany=false logfj.appender.file = <some file appender>
OK, starting from beginning. A very simple example.
src/main/java/Log4JTest.java
package org.stackoverflow; import org.apache.log4j.Logger; /** * @author maba, 2012-08-22 */ public class Log4JTest { public static final Logger log = Logger.getLogger(Log4JTest.class); public static void main(String[] args) { log.error("Error in main"); } }
src/main/resources/log4j.properties
log4j.rootLogger = ERROR, console log4j.appender.console = org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
Now compile and make sure that log4j.properties is in your classpath together with the log4j.jar and your own classes when running.
You will see this:
0 [main] ERROR org.stackoverflow.Log4JTest - Error in main
From here you can try to add a file appender or your own memory appender.
其他推荐答案
I've just fixed this issue by setting this at log4j.xml, replaced value="TRACE" to value="ERROR". Hope this can help some one :)
<root> <priority value="ERROR" /> <appender-ref ref="STDOUT"/> </root>