[求助] Log4j按类输出日志

商科程序员 2006-06-14 11:26:15
具体要求:
在我的程序中有许多的类,每个类都有log4j打出的日志,而且日志级别也是什么级别都有.
把每个类的日志跟据需要输出到不同的文件或者是只在控制台打印出指定类的日志.
最好在不改代码的情况下达到要求,或者修改少量代码.

最好给出具体实现例子
...全文
1051 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
商科程序员 2006-06-15
  • 打赏
  • 举报
回复
结贴了.
商科程序员 2006-06-15
  • 打赏
  • 举报
回复
谢谢楼上的解答, 不过你的解答不是我的要求
我的要求是根据类名和包名决定是否输出, 并不是把不同级别的日志输出到不同的文件中.

我已经用过滤器把这个问题解决了.
结贴了.
把我写的过滤器也贴上来:
////////////////////// 配置文件: ////////////////////////
<filter class="log4jtest.ClassLogFilter">
<param name="StringToMatch" value="log4jtest.CompareTools"/>
<param name="AcceptOnMatch" value="false"/>
</filter>

///////////////////// log4jtest.ClassLogFilter ///////////////////
package log4jtest;

import org.apache.log4j.spi.Filter;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.varia.StringMatchFilter;

public class ClassLogFilter extends StringMatchFilter
{
String stringToMatch = null;
boolean acceptOnMatch = true;

@Override
public int decide(LoggingEvent event)
{
// System.out.println(event.getLoggerName().indexOf(this.getStringToMatch())
// == -1);
System.out.println("acceptOnMatch = " + acceptOnMatch);
System.out.println("stringToMatch = " + stringToMatch);
System.out.println("event.getLoggerName() = " + event.getLoggerName());
System.out.println(event.getLoggerName().indexOf(this.stringToMatch));
if (event.getLoggerName().indexOf(this.stringToMatch) == -1)
return Filter.ACCEPT;
else
// if (acceptOnMatch)
return Filter.DENY;
// else
// return Filter.DENY;
}

public boolean getAcceptOnMatch()
{
return acceptOnMatch;
}

public void setAcceptOnMatch(Boolean acceptOnMatch)
{
this.acceptOnMatch = acceptOnMatch;
}

public String getStringToMatch()
{
return stringToMatch;
}

public void setStringToMatch(String stringToMatch)
{
this.stringToMatch = stringToMatch;
}
}

返回结果是返回ACCEPT显示, 返回DENY就不显示, 返回NATRUAL也显示.
具体过滤方法可以自己来定义.
我这里写的不是很详细,有兴趣的朋友可以自己去看看文档.
zeq258 2006-06-15
  • 打赏
  • 举报
回复
想只把log4j的debug信息输出到debug.log.error信息输出到error.log,info信息输出到info.log

log4j提供了下面一种方式来实现.

必须使用xml方式进行配置才能够支持filter过滤元素。

配置文件来自:

http://www.mail-archive.com/log4j-user@jakarta.apache.org/msg09720.html


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>

<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%c %d{ISO8601}
-- %p -- %m%n"/>
</layout>
</appender>

<appender name="DEBUG" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="C:\\logs\\app-debug.log"/>
<param name="Append" value="true"/>
<param name="MaxFileSize" value="500KB"/>
<param name="MaxBackupIndex" value="2"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%c %d{ISO8601}
-- %p -- %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="DEBUG" />
<param name="LevelMax" value="DEBUG" />
</filter>
</appender>

<appender name="INFO" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="C:\\logs\\app-info.log"/>
<param name="Append" value="true"/>
<param name="MaxFileSize" value="500KB"/>
<param name="MaxBackupIndex" value="2"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%c %d{ISO8601}
-- %p -- %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="INFO" />
</filter>
</appender>

<appender name="WARN" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="C:\\logs\\app-warn.log"/>
<param name="Append" value="true"/>
<param name="MaxFileSize" value="500KB"/>
<param name="MaxBackupIndex" value="2"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%c %d{ISO8601}
-- %p -- %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="WARN" />
<param name="LevelMax" value="WARN" />
</filter>
</appender>

<appender name="ERROR" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="C:\\logs\\app-error.log"/>
<param name="Append" value="true"/>
<param name="MaxFileSize" value="500KB"/>
<param name="MaxBackupIndex" value="2"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%c %d{ISO8601}
-- %p -- %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="ERROR" />
<param name="LevelMax" value="ERROR" />
</filter>
</appender>

<root>
<priority value="debug"/>
<appender-ref ref="STDOUT"/>
<appender-ref ref="DEBUG"/>
<appender-ref ref="INFO"/>
<appender-ref ref="WARN"/>
<appender-ref ref="ERROR"/>
</root>

</log4j:configuration>
商科程序员 2006-06-14
  • 打赏
  • 举报
回复
再顶! 顶到有人回答为止.

据说是有办法的,我正在研究.
我想应该是用过滤器什么的方法吧.
ttaallkk1 2006-06-14
  • 打赏
  • 举报
回复
mark
商科程序员 2006-06-14
  • 打赏
  • 举报
回复
人气太旺了,很快就被挤下去了.

在线等,急用.分数不是问题.
商科程序员 2006-06-14
  • 打赏
  • 举报
回复
希望找到一个XML配置文件的解答.
商科程序员 2006-06-14
  • 打赏
  • 举报
回复
楼上的,还是没搞明白.以下是我的程序和配置文件,请指正错误.

/////////////// ClassLog.java ////////////////////
package log4jtest;

import org.apache.log4j.Logger;
import org.apache.log4j.Priority;
import org.apache.log4j.PropertyConfigurator;

public class ClassLog
{
static Logger logger = Logger.getLogger(ClassLog2.class.getName());

public ClassLog()
{
}

public static void main(String[] args)
{
PropertyConfigurator.configure
("C:\\eclipse\\workspace\\mytest\\log4jtest\\log4j.properties");
logger.debug("Start of the main() in classlog");
logger.info("Just testing a log message with priority set to INFO");
logger.warn("Just testing a log message with priority set to WARN");
logger.error("Just testing a log message with priority set to ERROR");
logger.fatal("Just testing a log message with priority set to FATAL");
logger.log(Priority.WARN,"Testing a log message use a alternate form");
logger.debug(ClassLog2.class.getName());
ClassLog2 cl2 = new ClassLog2();
cl2.log();
}
}

////////////////// ClassLog2.java ///////////////////
package log4jtest;

import org.apache.log4j.Logger;
import org.apache.log4j.Priority;
import org.apache.log4j.PropertyConfigurator;

public class ClassLog2
{
static Logger logger = Logger.getLogger(ClassLog2.class.getName());

public ClassLog2()
{

}

public void log()
{
PropertyConfigurator.configure("C:\\eclipse\\workspace\\mytest\\log4jtest\\log4j.properties");
logger.debug("Start of the main() in classlog2");
logger.info("Just testing a log message with priority set to INFO");
logger.warn("Just testing a log message with priority set to WARN");
logger.error("Just testing a log message with priority set to ERROR");
logger.fatal("Just testing a log message with priority set to FATAL");
logger.log(Priority.WARN,"Testing a log message use a alternate form");
logger.debug(ClassLog2.class.getName());
}
}

///////////////// log4j.properties ////////////////
log4j.logger=debug,stdout,S,R

#2区
#Print only messages of priority WARN or higher for your category
log4j.logger.log4jtest.ClassLog=WARN,stdout,R
#log4j.logger.log4jtest.ClassLog=WARN
log4j.logger.log4jtest.ClassLog2=DEBUG,S
#log4j.logger.log4jtest.ClassLog2=DEBUG

#3区
#### First appender writes to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

#4区
#### Second appender writes to a file
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=c:\\example.log2
# Control the maximum log file size
log4j.appender.R.MaxFileSize=100KB
# Archive log files (one backup file here)
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n



log4j.appender.stdout2=org.apache.log4j.ConsoleAppender
log4j.appender.stdout2.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout2.layout.ConversionPattern=[%t] (%F:%L) - %m%n

log4j.appender.S=org.apache.log4j.RollingFileAppender
log4j.appender.S.File=c:\\example.log
# Control the maximum log file size
log4j.appender.S.MaxFileSize=100KB
# Archive log files (one backup file here)
log4j.appender.S.MaxBackupIndex=1
log4j.appender.S.layout=org.apache.log4j.PatternLayout
log4j.appender.S.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n
pigo 2006-06-14
  • 打赏
  • 举报
回复


具体配置在log4j.properties里

log4j.logger.com.chouy.Class1=DEBUG,CONSOLE

log4j.logger.com.chouy.Class2=INFO,CONSOLE

以此类推。

log4j.logger. 这个是前缀
然后后面跟上你的包名和类名。




67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧