一.log4j的用法:要进行两步,第一写一个配置文件log4j.properties,第二是在代码中加载这个配置文件并且写调用logger对象写log
第一步:log4j.properties内容如下:log4j.properties 路径如下:放在classpath下,即src目录下,classpath的路径获取this.getClass().getResource("/")
###配置根Logger###
log4j.rootLogger =info,debug , stdout , D 这里写debug,则是
###配置根Logger###
log4j.rootLogger = info,stdout,FILE #意思是多个目的地,debug , stdout,FILE都是自己命名的,<span style="color:#ff0000;">注意这个info必须写否则不输出到控制台,原因存疑</span>
###输出到控制台###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.Threshold = DEBUG 这个级别是打日志的级别要求,和下面的不共用
log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L - %m%n
### 输出到日志文件 ###
log4j.appender.FILE = org.apache.log4j.DailyRollingFileAppender
log4j.appender.FILE.File = logs/run.log #web就是相对于服务器根目录/纯java就是相对于classpath
log4j.appender.FILE.Append = true
log4j.appender.FILE.Threshold = INFO
log4j.appender.FILE.layout = org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
###以下是一个简单配置,加深理解,平时用上面的就行###
log4j.rootLogger=CONSOLE,FILE #意思是多个目的地CONSOLE,FILE 是固定写法了,上面的stdout 和D 是自己命名的
log4j.addivity.org.apache=true
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=./result.log #web就是相对于服务器根目录/纯java就是相对于classpath
log4j.appender.FILE.Append=false
log4j.appender.FILE.Encoding=GBK
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
第二步:代码中写
这三句是核心,直接用即可,其他不管
PropertyConfigurator.configure(filepath);//加载properties文件,log4j 的配置文件放在claspath下再叫这个名字,这句代码可以不写,log4j 会默认去找这个文件
Logger logger=Logger.getLogger("concurrentapi.testAA"); // 获取日志记录器
logger.debug("Log4jTest-->>debug");
public static void main(String args[]) throws IOException, InterruptedException, URISyntaxException{
invokeShell is = new invokeShell(delayTime, args, delayTime, delayTime);
URL url = is.getClass().getResource("/");//以上两句如果是类直接操作为 invokeShell.class.getClass().getResource("/");
//System.out.println(is.getClass().getResource("/"));//这个是classpath,带协议名file:/D:/Users/a/workspaceReal1/Performance/build/classes
System.out.println(url.getFile().substring(1));//去掉协议名和斜线,变成D:/.....
String filepath = url.getFile().substring(1)+"log4j.properties";//home/deploy/apache-tomcat-8.0.26/webapps/Performance
PropertyConfigurator.configure(filepath);//加载properties文件,log4j 的配置文件放在claspath下再叫这个名字,这句代码可以不写,log4j 会默认去找这个文件
Logger logger=Logger.getLogger("concurrentapi.testAA"); // 获取日志记录器
logger.debug("Log4jTest-->>debug");
logger.info("Log4jTest-->>info");
logger.warn("Log4jTest-->>warn");
logger.error("Log4jTest-->>error");
logger.error("fff");
}
以上代码,增加判断linux/windows系统:
if(System.getProperties().getProperty("os.name").toLowerCase().contains("windows"))
filepath = url.getFile().substring(1)+"log4j.properties";//home/deploy/apache-tomcat-8.0.26/webapps/Performance
else
filepath = url.getFile()+"log4j.properties";//home/deploy/apache-tomcat-8.0.26/webapps/Performance
二.For Windows/linux/纯java应用/web应用的完整logger类为:
以上纯java应用中的log4j打日志类,应用到tomcat web项目中,注意打war包的时候,log4j.properties仍然放在classpath下面。其他不变。
最终完整的For Windows/linux/纯java应用/web应用的完整logger类为:
public class loggerFactory {
public Logger logger ;
public String className;
public loggerFactory(String className){
this.className = className;
}
public Logger getLogger() throws ClassNotFoundException{
//打日志
String filepath = "";
String currentClassName = Thread.currentThread().getStackTrace()[1].getClassName();//获取当前类名
Class<?> currentRuntimeClass = Class.forName(currentClassName);//获取当前运行时的Class对象,等价于类名直接.class(loggerFactory.class)
URL url = currentRuntimeClass.getResource("/");
if(System.getProperties().getProperty("os.name").toLowerCase().contains("windows"))
filepath = url.getFile().substring(1)+"log4j.properties";//home/deploy/apache-tomcat-8.0.26/webapps/Performance
else
filepath = url.getFile()+"log4j.properties";//home/deploy/apache-tomcat-8.0.26/webapps/Performance
PropertyConfigurator.configure(filepath);//<span class="KSFIND_CLASS" id="2KSFindDIV">加载</span>properties文件,如果不指定,则默认读取src文件夹下的log4j.properties
logger = Logger.getLogger(className);// 获取日志记录器
return logger;
}
}
调用的时候,无论在哪,直接如下方式即可:
Logger logger = new loggerFactory(loggerFactory.class.getName()).getLogger();
logger.debug("Log4jTest-->>debug");
logger.info("Log4jTest-->>info");
logger.warn("Log4jTest-->>warn");
logger.error("Log4jTest-->>error");
logger.error("fff");
三.生成的logs/result.log文件位置
(1)windows eclipse 纯java应用
classpath 下的生成 ,
当前classpath在本工程的目录下的.classpath文件中查到是build/classes,经查证,logs\result.log在build文件夹的同级目录下。
(2)linux纯java应用
classpath 下的生成 /logs/result.log
(3)windows tomcat下
E:/eclipse/logs/result.log
(4)linux tomcat 下:
/home/deploy/apache-tomcat-8.0.26/bin/logs/result.log
常见问题1:报错如下
log4j:WARN Error initializing output writer.
log4j:WARN Unsupported encoding?
log4j:WARN Error initializing output writer.
log4j:WARN Unsupported encoding?
解决办法是log4j.properties文件的以下配置语句后面加了空格
log4j.appender.FILE.Encoding=utf-8不要加空格
常见问题2:log4j.properties文件的log4j.rooLogger加上DEBUG
设置了CONSOLE,但是控制台不出现打印信息
解决办法是
log4j.rootLogger=DEBUG,CONSOLE,FILE
常见问题3:
log4j:WARN No appenders could be found for logger (concurrentapi.testAA).
log4j:WARN Please initialize the log4j system properly.
解决办法是
将log4j.properties的每个输出的配置写完整,我本次忽略的是CONSOLE的Encoding编码设置
加上log4j.appender.CONSOLE.Encoding=utf-8
完成任务