log4j的用法(For Windows/linux/纯java应用/web应用) logback 的用法在evernote里面

本文详细介绍了log4j的配置方法,包括如何编写log4j.properties文件、如何在代码中加载配置文件以及如何使用logger对象进行日志记录。同时,文章还提供了针对不同操作系统(如Windows和Linux)的完整logger类实现,以及如何处理常见的日志问题。最后,文章解释了生成的日志文件在不同环境下的存放位置。
摘要由CSDN通过智能技术生成

一.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


完成任务





log4j.properties
j
加载
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值