java logger是什么 java输出日志是什么有什么用
这篇文章给大家聊聊关于java logger是什么,以及java输出日志是什么有什么用对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。
java logger 参数怎么写
Logger所对应的属性文件在安装jdk目录下的jre/lib/logging.properties
logging.properties文件中的
handlers= java.util.logging.ConsoleHandler将日志内容输出到控制台
handlers= java.util.logging.FileHandler将日志文件输出到文件中
handlers= java.util.logging.ConsoleHandler,java.util.logging.FileHandler将日志内容同时输出到控制台和文件中
# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level= INFO//日志输出级别
java.util.logging.FileHandler.pattern=%h/java%u.log为生成的输出文件名称指定一个模式。
模式由包括以下特殊组件的字符串组成,则运行时要替换这些组件:
"/"本地路径名分隔符
"%t"系统临时目录
"%h""user.home"系统属性的值
"%g"区分循环日志的生成号
"%u"解决冲突的惟一号码
"%%"转换为单个百分数符号"%"
如果未指定"%g"字段,并且文件计数大于 1,那么生成号将被添加到所生成文件名末尾的小数点后面。
java.util.logging.FileHandler.limit= 50000限制文件的大小,以字节为单位
java.util.logging.FileHandler.count= 1指定有多少输出文件参与循环(默认为 1)。
java.util.logging.FileHandler.formatter= java.util.logging.XMLFormatter指定要使用的 Formatter类的名称(默认为java.util.logging.XMLFormatter)。另外一个是:java.util.logging.SimpleFormatter。XMLFormatter是以xml样式输出,SimpleFormatter是以普通样式输出。
java.util.logging.FileHandler.append指定是否应该将 FileHandler追加到任何现有文件上(默认为 false)。
Python中的logger和handler到底是个什么鬼
最近的任务经常涉及到日志的记录,特意去又学了一遍logging的记录方法。跟java一样,python的日志记录也是比较繁琐的一件事,在写一条记录之前,要写好多东西。典型的日志记录的步骤是这样的:
创建logger
创建handler
定义formatter
给handler添加formatter
给logger添加handler
写成代码差不多就是酱婶的(这个是照别的网页抄的,参考附注):
1 import logging2 3# 1、创建一个logger 4 logger= logging.getLogger('mylogger')
5 logger.setLevel(logging.DEBUG)
6 7# 2、创建一个handler,用于写入日志文件 8 fh= logging.FileHandler('test.log')
9 fh.setLevel(logging.DEBUG)
10 11#再创建一个handler,用于输出到控制台 12 ch= logging.StreamHandler()
13 ch.setLevel(logging.DEBUG)
14 15# 3、定义handler的输出格式(formatter)16 formatter= logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s')
17 18# 4、给handler添加formatter19 fh.setFormatter(formatter)
20 ch.setFormatter(formatter)
21 22# 5、给logger添加handler 23 logger.addHandler(fh)
24 logger.addHandler(ch)
之后才可以正式的开始记录日志。Java里面的java.util.Logging类差不多也是这样,代码还要更复杂一点。Golang的日志相对写法简单一些,不过没有什么格式,系统记录一条时间,内容格式完全自己手画。第三方的日志库倒是没有接触过,像Java的Log4j,Golang的log4go和seelog等等,不知道用起来会不会简单一点。我一直都记不住这些,因为不太理解logger和handler为什么要这样写。一直到这次任务中出现的在我看来相当“诡异”的bug,才深入理解了一下。
我的任务是这样的,要做一个日志切割的工具,按天将日志分割开,即每天0点产生一个新日志,将旧日志改名。并且,将超过3个月的日志删除掉,以保证磁盘空间不会被log占满。程序要求可以切割多个目录中的不同日志,具体路径由json中配置。
这里用到了logging.handlers类中的TimedRotatingFileHandler方法,用以获得一个handler。大概的写法为:
1 logger= logging.getLogger()#获得logger2 handler= logging.handlers.TimedRotatingFileHandler(logfile,'S', 1, 0)#切割日志3 handler.suffix='%Y%m%d'#切割后的日志设置后缀4 logger.addHandler(handler)#把logger添加上handler5 logger.fatal(datetime.datetime.now().strftime('%Y-%m-%d'))#在新日志中写上当天的日期这里我没有设置level和formatter。因为只是分割,对新日志没有什么影响。TimedRotatingFileHandler函数的方法见附注,或查看python的源码,这个函数是python写的,可以找到定义。这里我使用的是每秒生成一个新的日志文件,之后用Crontab在每天0点调度,然后用for循环处理json中的每一个日志文件。
但是奇怪的是,每次运行程序,第一个切割的日志生成一个分割后的文件,而后面的都生成两个新日志。百思不得其解。后检查代码觉得,可能是程序中设置的时间太短了,每秒生成一个文件,有可能一秒钟处理不完,就生成了两个。虽然这个说法没有什么科学根据,但是还是把TimedRotatingFileHandler中的第三个参数改成了60,即每60秒生成一个文件。完成,静静的等待crontab到时间。
叮!时间到。赶紧检查一下结果。一个好消息和一个坏消息。好消息是这次每个日志都只切割生成了一个新文件,没有生成两个。坏消息是每个文件里面添加的当天的日期的数量见鬼了。我切割了4条日志,生成的新日志里面就分别写上了一、二、三、四行当天日期。
此刻我的内心几乎是崩溃的。我开始思考为什么会这样。很明显四行日期是调用了4次logger.fatal('datetime.datetime.now().strftime('%Y-%m-%d'))这个函数。换句话说,我每一次for循环都在这个log里面写了一句话。可是明明每个for是处理一个日志,下一次for应该是处理下一个日志的,为什么会再处理这个日志一次?我突然想到,logger.addHandler(handler)是每次循环都会运行的,也就是说,logger是同一个logger,添加了4次handler。到第4次循环的时候,这个logger中有4个handler,也就会往4个不同的日志中添加内容了。呃。
如果是这样的话,那么把上面的程序改改,第一句和最后一句放在循环外,循环内只用中间的三句。这次OK了。回头再看log记录的步骤,也就明白了logger和handler到底是个什么鬼:logger可以看做是一个记录日志的人,对于记录的每个日志,他需要有一套规则,比如记录的格式(formatter),等级(level)等等,这个规则就是handler。使用logger.addHandler(handler)添加多个规则,就可以让一个logger记录多个日志。至于logging.getLogger()方法获得的root logger和继承关系,可以详见附注的网页,这里我也只是大概明白了什么意思,还没有具体用过。也许将来在框架中使用,要记录较为复杂的日志时候会用到吧。
java输出日志是什么有什么用
Java日志组件:
Java日志API由以下三个核心组件组成:
Loggers:Logger负责捕捉事件并将其发送给合适的Appender。
Appenders:也被称为Handlers,负责将日志事件记录到目标位置。在将日志事件输出之前,Appenders使用Layouts来对事件进行格式化处理。
Layouts:也被称为Formatters,它负责对日志事件中的数据进行转换和格式化。Layouts决定了数据在一条日志记录中的最终形式。
当Logger记录一个事件时,它将事件转发给适当的Appender。然后Appender使用Layout来对日志记录进行格式化,并将其发送给控制台、文件或者其它目标位置。另外,Filters可以让你进一步指定一个Appender是否可以应用在一条特定的日志记录上。在日志配置中,Filters并不是必需的,但可以更灵活地控制日志消息的流动。
好了,关于java logger是什么和java输出日志是什么有什么用的问题到这里结束啦,希望可以解决您的问题哈!