log配置文件详解|Spring Boot Logging 配置

A. Spring Boot Logging 配置

Spring Boot 能够使用Logback, Log4J2 , java util logging 作为日志记录工具。Spring Boot 默认使用Logback作为日志记录工具。日志默认输出到控制台但也能输出到文件中。我们通过spring-boot-starter-logging 加入Logback依赖,其实只要我们加入任意的Spring Boot starter 都会默认引入spring-boot-starter-logging,因此 我们不需要分开加入他们。

logging.level.* : 作为package(包)的前缀来设置日志级别。 logging.file : 配置日志输出的文件名,也可以配置文件名的绝对路径。 logging.path : 配置日志的路径。如果没有配置 logging.file ,Spring Boot 将默认使用spring.log作为文件名。 logging.pattern.console : 定义console中logging的样式。 logging.pattern.file : 定义文件中日志的样式。 logging.pattern.level : 定义渲染不同级别日志的格式。默认是%5p. logging.exception-conversion-word : .定义当日志发生异常时的转换字 PID : 定义当前进程的ID

下面将讨论在 application.properties , application.ym , Logback XML 中配置Logback以及在Spirng Boot 应用中使用Log4J2.

logging.level设置日志级别。我们可以使用TARCE , DEBUG , INFO , WARN , ERROR , FATAL , OFF 。可以使用root级别和package级别来控制日志的输入级别。创建一个具有以下依赖关系的应用程序。

使用 srcmainesourcesapplication.properties 配置日志级别

使用 srcmainesourcesapplication.yml

Spring Boot 默认把日志输入到console,如果我们要把日志输入到文件中,需要配置logging.file 或者logging.path属性性。logging.file属性用来定义文件名。他不仅仅可以配置文件名,也可以路径+文件名。

在这种情况下mylogfile.log将在根目录中创建。我们也可以为为mylogfile.log分配一个路径,如concretepage/mylogfile.log。这种情况下我们将在相对根目录下创建concretepage/mylogfile.log。我们也可以为日志文件配置绝对路径。 application.yml 中配置

配置logging.path或者logging.path属性将日志输出到文件夹中。logging.path属性用来定义日志文件路径 在 application.properties 中配置logging.path属性

将会相对根路径下创建concretepage/logs/spring.log ,也可以配置绝对路径

application.yml 配置

通过设置logging.patter.console属性我们能改变输出到console的日志样式。日志样式包括时间,日志级别,线程名,日志名以及消息。我们可以按我们的喜好改变日志样式。 application.properties

application.yml

改变文件中的日志样式我们需要设置logging.pattern.file属性。首先通过logging.file或logging.path属性,把日志记录到文件中。

通过logging.path属性将在根目录下创建concretepage/logs并默认使用spring.log作为文件名。logging.pattern.console是设置console的日志样式 application.yml

通过命令行改变日志的输出级别 Sping Boot 默认输出ERROR , WARN , INFO 级别的日志。我们可以通过命令行使能DEBUG ,TRACE级别的日志输出,效果是跟配置文件一样的。想象我们有一个名为my-app.jar的可执行的JAR包我们可以在启动应用是使能DEBUG级别日志输出。

在application.properties中配置

application.yml

相同的方式使能TRACE级别的日志

application.properties

application.yml

在应用程序中记录日志 创建一个SLF4J的例子,首先获得org.slf4j.Logger的实例。

在application.properties配置包com.concretepage日志记录级别

输出

使用Logback XML 文件 Sping Boot中默认使用logback, 我们可以在application.properties或者application.yml中设置日志级别。如果想使用XML配置Logback,我们需要在类路径下创建logback-spring.xml文件 srcmainesourceslogback-spring.xml

使用自定义日志:Log4J2 我们使用任何的starter,默认加入Logback 依赖spring-boot-starter-logging。为了使用Log4J2,我们首先要去除spring-boot-starter-logging并且引入spring-boot-starter-log4j2 依赖

现在我们可以在类路径下创建并配置log4j2-spring.xml

原文: http://www.concretepage.com/spring-boot/spring-boot-logging-example

B. log4net配置文件解析

<log net>

<root>

<level value= ALL />

<appender ref ref= rollingFile />

</root>

<appender name= rollingFile type= log net Appender RollingFileAppender log net >

<param name= File value= log txt />

<param name= AppendToFile value= false />

<param name= RollingStyle value= Date />

<param name= DatePattern value= yyyy MM dd />

<param name= StaticLogFileName value= true />

<layout type= log net Layout PatternLayout log net >

<param name= ConversionPattern value= %d [%t] % p %c %m%n />

<param name= Header value= header />

<param name= Footer value= footer />

</layout>

</appender>

<appender name= consoleApp type= log net Appender ConsoleAppender log net >

<layout type= log net Layout PatternLayout log net >

<param name= ConversionPattern value= %d [%t] % p %c %m%n />

</layout>

</appender>

<logger name= Log NetTest LogTest >

<level value= DEBUG />

<appender ref ref= rollingFile />

<appender ref ref= coloredConsoleApp />

<appender ref ref= SystemEvent />

</logger>

</log net>

log net配置节的XSD层次如下

<log net>

<root><level /><appender ref ref= /></root>

<appender name= type= Appender的完全限定类名 >

<param name= value= />

<layout type= log net Layout PatternLayout log net >

<param name= value= />

</layout>

</appender>

<logger>

<level value= />

<appender ref ref= />

</logger>

log net是log net配置节的根标记

root标记定义一个根级别的记录者 log net的记录者采用层级组织的 每一个LOGGER(ROOT也是一个LOGGER 只不过 他是祖先而已 别的方面 跟其他LOGGER一样) 都可以定义Level

level定义记录的日志级别 就是说 你要记录哪个级别以上的日志 级别由高往低依次是:

None

Fatal

ERROR

WARN

DEBUG

INFO

ALL

级别的定义要注意 如果你定义DEBUG 那么低于DEBUG级别以下的信息 将不会记入日志 啥意思呢?就是说 就算你在程序里 用()来写入一个日志信息 可是你在配置中指定level为DEBUG 由于INFO级别低于DEBUG 所以 不会被记入日志 这样的处理非常灵活

Logger还有一个配置就是appender ref了 ref是参照的意思 log net的架构非常有意思 可扩展性非常高非常值得借鉴 他分为四个要素:

logger

appender

layout

filter

logger是负责日志的记录者

appender提供记录的介质

layout负责把记入的内容格式化

filter负责把内容进行筛选

可以说 整个过程就是一个日志流水线 每个成员负责其中的一个环节

logger发出记录信息 appender接到信息 根据内部的layout配置对记录信息格式化 根据filter决定此信息是否被过滤掉 最后 将其序列化

因此 logger的appender ref就是定义说 LOGGER要找谁去将内容写入磁盘 流或其他介质 因此 十分重要吧

既然是ref引用 那肯定要定义这个被引用的appender对象了呀

每个appender都代表了一个输出介质

name属性指定其名称 type则是log net Appender命名空间的一个类的名称 意思是 指定使用哪种介质

log net支持的appender类型有十几种 最常用的有rollingFileAppender AdoNetAppender EventLogAppender FileAppender 分别把日志记入文件 系统日志和数据库

除此之外 appender内的其他参数都用param标记 以key/value形式定义于其内

这里有个小提示 每一个appender log net并没有在文档中提出他们需要哪些参数 那么 我们怎么知道呢?

原来 这些param的名称 你可以直接查对应的appender类的属性名即可 例如 使用EventLogAppender时 通过查看类的属性 我们知道其有

LogName ApplicationName属性 那么 意味着 你可以直接在这个APPENDER的param里加入以下内容:

<param name= LogName value= Application />

<param name= ApplicationName value= log netTest />

定义了appender的NAME及TYPE属性 以及使用param为其指定参数后 一个appender就建立了 你可以使用他的名字在LOGGER的<appender ref中去 引用它 那么 引用它的LOGGER在写入日志时 就是写到了APPENDER中定义的介质中去了

一个LOGGER可以引用多个APPENDER 其结果是 同一个日志 被同时记录到多个介质中去 便如 同时发邮件 写入系统日志 发送到远程主机 不过 虽然可以这样做 但是还是要小心 因为 会对性能有一定的影响 除非你需要 否则 不要乱用此功能

另外 appender中可以定义可选的layout

layout的定义非常有必要 如果你不想将来看到你的日志会感觉头晕的话 虽然log net帮你写入日志 但是 日志信息的格式却是我们使用者自行定义的layout的type参数指定使用哪个类的定义来格式化 常用的有XmlLayout SimpleLayout PatternLayout 这个当然要根据你的需要 以及你要产生的格式来选啦 如果你要输出成XML文档格式 你肯定不能用simplelayout吧

layout使用param以KEY/VALUE形式定义其参数

各个Layout类使用的参数当然不一样啦 具体的 你可以去看各个Layout类的属性

其中 PatternLayout可以使用ConversionPattern参数来指定一个格式化字符串

以及可以指定一个Header参数 做为日志开头的字符串 Footer来指定结尾字符串

这里有一个小技巧 日志中开头和结尾总想产生回车符吧 虽然logger在写入一条日志会自动回车 可是Header和FOOTER却不会 咋办?用
吗?(我从别人的BLOG上看到过)经实践
会原样定改日志 根本不会转换 其实 我们可以用XML实体呀 使用&# ;&# ;就可以在指定位置插入一个回车换行符了

最后 像log net的文档中说的那样 如果你不想你的日志文件变得很大 使读写的性能下降的话 建议你还是分级管理日志 把粒度变小点 也就是说 除了定义ROOT外 最后 对每一个模块或每一个实体 依据用途 目的 定义各自的LOGGER配置 这样的好处是日志被分散了 日志文件增长就没那么快了 每一个LOGGER的结构跟ROOT是一模一样的 这里不再叙述了 像前面说的那样 如果你相让日志产生层级关系 你可以跟他们的NAME属性像C#中的namespace那样命名就可以了

要说明的是 LOGGER的定义是非必须的 只是一种建议罢了 Log net的配置中 除了必须定义一个ROOT和一个APPENDER外 其他的都是可选的

lishixin/Article/program/net/201311/11448

C. python涔嬮厤缃鏃ュ織鐨勫嚑绉嶆柟寮

鏈绡囨枃绔犱富瑕佷粙缁嶄簡璇﹁Вpython涔嬮厤缃鏃ュ織鐨勫嚑绉嶆柟寮忥紝鐜板湪鍒嗕韩缁欏ぇ瀹讹紝涔熺粰澶у跺仛涓鍙傝冦備竴璧疯繃鏉ョ湅鐪嬪惂浣滀负寮鍙戣咃紝鎴戜滑鍙浠ラ氳繃浠ヤ笅3涓鏂瑰紡鏉ラ厤缃甽ogging:1锛変娇鐢≒ython浠g爜鏄惧紡鐨勫垱寤簂oggers, handlers鍜宖ormatters骞跺垎鍒璋冪敤瀹冧滑鐨勯厤缃鍑芥暟锛2锛夊垱寤轰竴涓鏃ュ織閰嶇疆鏂囦欢锛岀劧鍚庝娇鐢╢ileConfig()鍑芥暟鏉ヨ诲彇璇ユ枃浠剁殑鍐呭癸紱3锛夊垱寤轰竴涓鍖呭惈閰嶇疆淇℃伅鐨刣ict锛岀劧鍚庢妸瀹冧紶閫掍釜dictConfig()鍑芥暟锛闇瑕佽存槑鐨勬槸锛宭ogging.basicConfig()涔熷睘浜庣涓绉嶆柟寮忥紝瀹冨彧鏄瀵筶oggers, handlers鍜宖ormatters鐨勯厤缃鍑芥暟杩涜屼簡灏佽呫傚彟澶栵紝绗浜岀嶉厤缃鏂瑰紡鐩稿逛簬绗涓绉嶉厤缃鏂瑰紡鐨勪紭鐐瑰湪浜庯紝瀹冨皢閰嶇疆淇℃伅鍜屼唬鐮佽繘琛屼簡鍒嗙伙紝杩欎竴鏂归潰闄嶄綆浜嗘棩蹇楃殑缁存姢鎴愭湰锛屽悓鏃惰繕浣垮緱闈炲紑鍙戜汉鍛樹篃鑳藉熷幓寰堝规槗鍦颁慨鏀规棩蹇楅厤缃銆涓銆佷娇鐢≒ython浠g爜瀹炵幇鏃ュ織閰嶇疆浠g爜濡備笅锛# 鍒涘缓涓涓鏃ュ織鍣╨ogger骞惰剧疆鍏舵棩蹇楃骇鍒涓篋EBUGlogger = logging.getLogger('simple_logger')logger.setLevel(logging.DEBUG)# 鍒涘缓涓涓娴佸勭悊鍣╤andler骞惰剧疆鍏舵棩蹇楃骇鍒涓篋EBUGhandler = logging.StreamHandler(sys.stdout)handler.setLevel(logging.DEBUG)# 鍒涘缓涓涓鏍煎紡鍣╢ormatter骞跺皢鍏舵坊鍔犲埌澶勭悊鍣╤andlerformatter = logging.Formatter("%(asctime)s – %(name)s – %(levelname)s – %(message)s")handler.setFormatter(formatter)# 涓烘棩蹇楀櫒logger娣诲姞涓婇潰鍒涘缓鐨勫勭悊鍣╤andlerlogger.addHandler(handler)# 鏃ュ織杈撳嚭logger.debug('debug message')logger.info('info message')logger.warn('warn message')logger.error('error message')logger.critical('critical message')杩愯岃緭鍑猴細2017-05-15 11:30:50,955 – simple_logger – DEBUG – debug message2017-05-15 11:30:50,955 – simple_logger – INFO – info message2017-05-15 11:30:50,955 – simple_logger – WARNING – warn message2017-05-15 11:30:50,955 – simple_logger – ERROR – error message2017-05-15 11:30:50,955 – simple_logger – CRITICAL – critical message浜屻佷娇鐢ㄩ厤缃鏂囦欢鍜宖ileConfig()鍑芥暟瀹炵幇鏃ュ織閰嶇疆鐜板湪鎴戜滑閫氳繃閰嶇疆鏂囦欢鐨勬柟寮忔潵瀹炵幇涓庝笂闈㈠悓鏍风殑鍔熻兘锛# 璇诲彇鏃ュ織閰嶇疆鏂囦欢鍐呭logging.config.fileConfig('logging.conf')# 鍒涘缓涓涓鏃ュ織鍣╨oggerlogger = logging.getLogger('simpleExample')# 鏃ュ織杈撳嚭logger.debug('debug message')logger.info('info message')logger.warn('warn message')logger.error('error message')logger.critical('critical message')閰嶇疆鏂囦欢logging.conf鍐呭瑰備笅锛[loggers]keys=root,simpleExample[handlers]keys=fileHandler,consoleHandler[formatters]keys=simpleFormatter[logger_root]level=DEBUGhandlers=fileHandler[logger_simpleExample]level=DEBUGhandlers=consoleHandlerqualname=simpleExamplepropagate=0[handler_consoleHandler]class=StreamHandlerargs=(sys.stdout,)level=DEBUGformatter=simpleFormatter[handler_fileHandler]class=FileHandlerargs=('logging.log', 'a')level=ERRORformatter=simpleFormatter[formatter_simpleFormatter]format=%(asctime)s – %(name)s – %(levelname)s – %(message)sdatefmt=杩愯岃緭鍑猴細2017-05-15 11:32:16,539 – simpleExample – DEBUG – debug message2017-05-15 11:32:16,555 – simpleExample – INFO – info message2017-05-15 11:32:16,555 – simpleExample – WARNING – warn message2017-05-15 11:32:16,555 – simpleExample – ERROR – error message2017-05-15 11:32:16,555 – simpleExample – CRITICAL – critical message1. 鍏充簬fileConfig()鍑芥暟鐨勮存槑锛璇ュ嚱鏁板疄闄呬笂鏄瀵筩onfigparser妯″潡鐨勫皝瑁咃紝鍏充簬configparser妯″潡鐨勪粙缁嶈峰弬鑰<銆鍑芥暟瀹氫箟锛璇ュ嚱鏁板畾涔夊湪loging.config妯″潡涓嬶細 浠g爜濡備笅:logging.config.fileConfig(fname, defaults=None, disable_existing_loggers=True)鍙傛暟锛fname锛氳〃绀洪厤缃鏂囦欢鐨勬枃浠跺悕鎴栨枃浠跺硅薄defaults锛氭寚瀹氫紶缁機onfigParser鐨勯粯璁ゅdisable_existing_loggers锛氳繖鏄涓涓甯冨皵鍨嬪硷紝榛樿ゅ间负True锛堜负浜嗗悜鍚庡吋瀹癸級琛ㄧず绂佺敤宸茬粡瀛樺湪鐨刲ogger锛岄櫎闈炲畠浠鎴栬呭畠浠鐨勭栧厛鏄庣‘鐨勫嚭鐜板湪鏃ュ織閰嶇疆涓锛涘傛灉鍊间负False鍒欏瑰凡瀛樺湪鐨刲oggers淇濇寔鍚鍔ㄧ姸鎬併2. 閰嶇疆鏂囦欢鏍煎紡璇存槑锛涓婇潰鎻愬埌杩囷紝fileConfig()鍑芥暟鏄瀵笴onfigParser/configparser妯″潡鐨勫皝瑁咃紝涔熷氨鏄璇磃ileConfig()鍑芥暟鏄鍩轰簬ConfigParser/configparser妯″潡鏉ョ悊瑙f棩蹇楅厤缃鏂囦欢鐨勩傛崲鍙ヨ瘽璇达紝fileConfig()鍑芥暟鎵鑳界悊瑙g殑閰嶇疆鏂囦欢鍩虹鏍煎紡鏄涓嶤onfigParser/configparser妯″潡涓鑷寸殑锛屽彧鏄鍦ㄦゅ熀纭涓婂规枃浠朵腑鍖呭惈鐨剆ection鍜宱ption鍋氫簡涓涓嬭勫畾鍜岄檺鍒讹紝姣斿傦細1锛夐厤缃鏂囦欢涓涓瀹氳佸寘鍚玪oggers銆乭andlers銆乫ormatters杩欎簺section锛屽畠浠閫氳繃keys杩欎釜option鏉ユ寚瀹氳ラ厤缃鏂囦欢涓宸茬粡瀹氫箟濂界殑loggers銆乭andlers鍜宖ormatters锛屽氫釜鍊间箣闂寸敤閫楀彿鍒嗛殧锛涘彟澶杔oggers杩欎釜section涓鐨刱eys涓瀹氳佸寘鍚玶oot杩欎釜鍊硷紱2锛塴oggers銆乭andlers銆乫ormatters涓鎵鎸囧畾鐨勬棩蹇楀櫒銆佸勭悊鍣ㄥ拰鏍煎紡鍣ㄩ兘闇瑕佸湪涓嬮潰浠ュ崟鐙鐨剆ection杩涜屽畾涔夈俿eciton鐨勫懡鍚嶈勫垯涓篬logger_loggerName]銆乕formatter_formatterName]銆乕handler_handlerName]3锛夊畾涔塴ogger鐨剆ection蹇呴』鎸囧畾level鍜宧andlers杩欎袱涓猳ption锛宭evel鐨勫彲鍙栧间负DEBUG銆両NFO銆乄ARNING銆丒RROR銆丆RITICAL銆丯OTSET锛屽叾涓璑OTSET琛ㄧず鎵鏈夌骇鍒鐨勬棩蹇楁秷鎭閮借佽板綍锛屽寘鎷鐢ㄦ埛瀹氫箟绾у埆锛沨andlers鐨勫兼槸浠ラ楀彿鍒嗛殧鐨刪andler鍚嶅瓧鍒楄〃锛岃繖閲屽嚭鐜扮殑handler蹇呴』鍑虹幇鍦╗handlers]杩欎釜section涓锛屽苟涓旂浉搴旂殑handler蹇呴』鍦ㄩ厤缃鏂囦欢涓鏈夊瑰簲鐨剆ection瀹氫箟锛4锛夊逛簬闈瀝oot logger鏉ヨ达紝闄や簡level鍜宧andlers杩欎袱涓猳ption涔嬪栵紝杩橀渶瑕佷竴浜涢濆栫殑option锛屽叾涓璹ualname鏄蹇呴』鎻愪緵鐨刼ption锛屽畠琛ㄧず鍦╨ogger灞傜骇涓鐨勫悕瀛楋紝鍦ㄥ簲鐢ㄤ唬鐮佷腑閫氳繃杩欎釜鍚嶅瓧寰楀埌logger锛沺ropagate鏄鍙閫夐」锛屽叾榛樿ゆ槸涓1锛岃〃绀烘秷鎭灏嗕細浼犻掔粰楂樺眰娆logger鐨刪andler锛岄氬父鎴戜滑闇瑕佹寚瀹氬叾鍊间负0锛岃繖涓鍙浠ョ湅涓嬩笅闈㈢殑渚嬪瓙锛涘彟澶栵紝瀵逛簬闈瀝oot logger鐨刲evel濡傛灉璁剧疆涓篘OTSET锛岀郴缁熷皢浼氭煡鎵鹃珮灞傛$殑logger鏉ュ喅瀹氭logger鐨勬湁鏁坙evel銆5锛夊畾涔塰andler鐨剆ection涓蹇呴』鎸囧畾class鍜宎rgs杩欎袱涓猳ption锛宭evel鍜宖ormatter涓哄彲閫塷ption锛沜lass琛ㄧず鐢ㄤ簬鍒涘缓handler鐨勭被鍚嶏紝args琛ㄧず浼犻掔粰class鎵鎸囧畾鐨刪andler绫诲垵濮嬪寲鏂规硶鍙傛暟锛屽畠蹇呴』鏄涓涓鍏冪粍锛坱uple锛夌殑褰㈠紡锛屽嵆渚垮彧鏈変竴涓鍙傛暟鍊间篃闇瑕佹槸涓涓鍏冪粍鐨勫舰寮忥紱level涓巐ogger涓鐨刲evel涓鏍凤紝鑰宖ormatter鎸囧畾鐨勬槸璇ュ勭悊鍣ㄦ墍浣跨敤鐨勬牸寮忓櫒锛岃繖閲屾寚瀹氱殑鏍煎紡鍣ㄥ悕绉板繀椤诲嚭鐜板湪formatters杩欎釜section涓锛屼笖鍦ㄩ厤缃鏂囦欢涓蹇呴』瑕佹湁杩欎釜formatter鐨剆ection瀹氫箟锛涘傛灉涓嶆寚瀹歠ormatter鍒欒handler灏嗕細浠ユ秷鎭鏈韬浣滀负鏃ュ織娑堟伅杩涜岃板綍锛岃屼笉娣诲姞棰濆栫殑鏃堕棿銆佹棩蹇楀櫒鍚嶇О绛変俊鎭锛6锛夊畾涔塮ormatter鐨剆ectioin涓鐨刼ption閮芥槸鍙閫夌殑锛屽叾涓鍖呮嫭format鐢ㄤ簬鎸囧畾鏍煎紡瀛楃︿覆锛岄粯璁や负娑堟伅瀛楃︿覆鏈韬锛沝atefmt鐢ㄤ簬鎸囧畾asctime鐨勬椂闂存牸寮忥紝榛樿や负'%Y-%m-%d %H:%M:%S'锛沜lass鐢ㄤ簬鎸囧畾鏍煎紡鍣ㄧ被鍚嶏紝榛樿や负logging.Formatter锛璇存槑锛閰嶇疆鏂囦欢涓鐨刢lass鎸囧畾绫诲悕鏃讹紝璇ョ被鍚嶅彲浠ユ槸鐩稿逛簬logging妯″潡鐨勭浉瀵瑰硷紝濡傦細FileHandler銆乭andlers.TimeRotatingFileHandler锛涗篃鍙浠ユ槸涓涓缁濆硅矾寰勫硷紝閫氳繃鏅閫氱殑import鏈哄埗鏉ヨВ鏋愶紝濡傝嚜瀹氫箟鐨刪andler绫籱ypackage.mymole.MyHandler锛屼絾鏄痬ypackage闇瑕佸湪Python鍙鐢ㄧ殑瀵煎叆璺寰勪腑–sys.path銆3. 瀵逛簬propagate灞炴х殑璇存槑瀹炰緥1锛鎴戜滑鎶妉ogging.conf涓璼impleExample杩欎釜handler瀹氫箟涓鐨刾ropagate灞炴у兼敼涓1锛屾垨鑰呭垹闄よ繖涓猳ption锛堥粯璁ゅ煎氨鏄1锛夛細[logger_simpleExample]level=DEBUGhandlers=consoleHandlerqualname=simpleExamplepropagate=1鐜板湪鏉ユ墽琛屽悓鏍风殑浠g爜锛# 璇诲彇鏃ュ織閰嶇疆鏂囦欢鍐呭logging.config.fileConfig('logging.conf')# 鍒涘缓涓涓鏃ュ織鍣╨oggerlogger = logging.getLogger('simpleExample')# 鏃ュ織杈撳嚭logger.debug('debug message')logger.info('info message')logger.warn('warn message')logger.error('error message')logger.critical('critical message')鎴戜滑浼氬彂鐜帮紝闄や簡鍦ㄦ帶鍒跺彴鏈夎緭鍑轰俊鎭鏃跺欙紝鍦╨ogging.log鏂囦欢涓涔熸湁鍐呭硅緭鍑:2017-05-15 16:06:25,366 – simpleExample – ERROR – error message2017-05-15 16:06:25,367 – simpleExample – CRITICAL – critical message杩欒存槑simpleExample杩欎釜logger鍦ㄥ勭悊瀹屾棩蹇楄板綍鍚庯紝鎶婃棩蹇楄板綍浼犻掔粰浜嗕笂绾х殑root logger鍐嶆″仛澶勭悊锛屾墍鏈夋墠浼氭湁涓や釜鍦版柟閮芥湁鏃ュ織璁板綍鐨勮緭鍑恒傞氬父锛屾垜浠閮介渶瑕佹樉绀虹殑鎸囧畾propagate鐨勫间负0锛岄槻姝㈡棩蹇楄板綍鍚戜笂灞俵ogger浼犻掋瀹炰緥2锛鐜板湪锛屾垜浠璇曠潃鐢ㄤ竴涓娌℃湁鍦ㄩ厤缃鏂囦欢涓瀹氫箟鐨刲ogger鍚嶇О鏉ヨ幏鍙杔ogger锛# 璇诲彇鏃ュ織閰嶇疆鏂囦欢鍐呭logging.config.fileConfig('logging.conf')# 鐢ㄤ竴涓娌℃湁鍦ㄩ厤缃鏂囦欢涓瀹氫箟鐨刲ogger鍚嶇О鏉ュ垱寤轰竴涓鏃ュ織鍣╨oggerlogger = logging.getLogger('simpleExample1')# 鏃ュ織杈撳嚭logger.debug('debug message')logger.info('info message')logger.warn('warn message')logger.error('error message')logger.critical('critical message')杩愯岀▼搴忓悗锛屾垜浠浼氬彂鐜版帶鍒跺彴娌℃湁浠讳綍杈撳嚭锛岃宭ogging.log鏂囦欢涓鍙堝氫簡涓よ岃緭鍑猴細2017-05-15 16:13:16,810 – simpleExample1 – ERROR – error message2017-05-15 16:13:16,810 – simpleExample1 – CRITICAL – critical message杩欐槸鍥犱负锛屽綋涓涓鏃ュ織鍣ㄦ病鏈夎璁剧疆浠讳綍澶勭悊鍣ㄦ槸锛岀郴缁熶細鍘绘煡鎵捐ユ棩蹇楀櫒鐨勪笂灞傛棩蹇楀櫒涓婃墍璁剧疆鐨勬棩蹇楀勭悊鍣ㄦ潵澶勭悊鏃ュ織璁板綍銆俿impleExample1鍦ㄩ厤缃鏂囦欢涓娌℃湁琚瀹氫箟锛屽洜姝logging.getLogger(simpleExample1)杩欒屼唬鐮佽繖鏄鑾峰彇浜嗕竴涓猯ogger瀹炰緥锛屽苟娌℃湁缁欏畠璁剧疆浠讳綍澶勭悊鍣锛屼絾鏄瀹冪殑涓婄骇鏃ュ織鍣–root logger鍦ㄩ厤缃鏂囦欢涓鏈夊畾涔変笖璁剧疆浜嗕竴涓狥ileHandler澶勭悊鍣锛宻impleExample1澶勭悊鍣ㄦ渶缁堥氳繃杩欎釜FileHandler澶勭悊鍣ㄥ皢鏃ュ織璁板綍杈撳嚭鍒發ogging.log鏂囦欢涓浜嗐涓夈佷娇鐢ㄥ瓧鍏搁厤缃淇℃伅鍜宒ictConfig()鍑芥暟瀹炵幇鏃ュ織閰嶇疆Python 3.2涓寮曞叆鐨勪竴绉嶆柊鐨勯厤缃鏃ュ織璁板綍鐨勬柟娉–鐢ㄥ瓧鍏告潵淇濆瓨logging閰嶇疆淇℃伅銆傝繖鐩稿逛簬涓婇潰鎵璁茬殑鍩轰簬閰嶇疆鏂囦欢鏉ヤ繚瀛榣ogging閰嶇疆淇℃伅鐨勬柟寮忔潵璇达紝鍔熻兘鏇村姞寮哄ぇ锛屼篃鏇村姞鐏垫椿锛屽洜涓烘垜浠鍙鎶婂緢澶氱殑鏁版嵁杞鎹㈡垚瀛楀吀銆傛瘮濡傦紝鎴戜滑鍙浠ヤ娇鐢↗SON鏍煎紡鐨勯厤缃鏂囦欢銆乊AML鏍煎紡鐨勯厤缃鏂囦欢锛岀劧鍚庡皢瀹冧滑濉鍏呭埌涓涓閰嶇疆瀛楀吀涓锛涙垨鑰咃紝鎴戜滑涔熷彲浠ョ敤Python浠g爜鏋勫缓杩欎釜閰嶇疆瀛楀吀锛屾垨鑰呴氳繃socket鎺ユ敹pickled搴忓垪鍖栧悗鐨勯厤缃淇℃伅銆傛讳箣锛屼綘鍙浠ヤ娇鐢ㄤ綘鐨勫簲鐢ㄧ▼搴忓彲浠ユ搷浣滅殑浠讳綍鏂规硶鏉ユ瀯寤鸿繖涓閰嶇疆瀛楀吀銆杩欎釜渚嬪瓙涓锛屾垜浠灏嗕娇鐢╕AML鏍煎紡鏉ュ畬鎴愪笌涓婇潰鍚屾牱鐨勬棩蹇楅厤缃銆棣栧厛闇瑕佸畨瑁匬yYAML妯″潡锛pip install PyYAMLPython浠g爜锛import loggingimport logging.configimport yamlwith open('logging.yml', 'r') as f_conf: dict_conf = yaml.load(f_conf)logging.config.dictConfig(dict_conf)logger = logging.getLogger('simpleExample')logger.debug('debug message')logger.info('info message')logger.warn('warn message')logger.error('error message')logger.critical('critical message')logging.yml閰嶇疆鏂囦欢鐨勫唴瀹癸細version: 1formatters: simple: format: '%(asctime)s – %(name)s – %(levelname)s – %(message)s'handlers: console: class: logging.StreamHandler level: DEBUG formatter: simple stream: ext://sys.stdout console_err: class: logging.StreamHandler level: ERROR formatter: simple stream: ext://sys.stderrloggers: simpleExample: level: DEBUG handlers: [console] propagate: yesroot: level: DEBUG handlers: [console_err]杈撳嚭缁撴灉锛2017-05-21 14:19:31,089 – simpleExample – DEBUG – debug message2017-05-21 14:19:31,089 – simpleExample – INFO – info message2017-05-21 14:19:31,089 – simpleExample – WARNING – warn message2017-05-21 14:19:31,089 – simpleExample – ERROR – error message2017-05-21 14:19:31,090 – simpleExample – CRITICAL – critical message1. 鍏充簬dictConfig()鍑芥暟鐨勮存槑锛璇ュ嚱鏁板疄闄呬笂鏄瀵筩onfigparser妯″潡鐨勫皝瑁呫鍑芥暟瀹氫箟锛璇ュ嚱鏁板畾涔夊湪loging.config妯″潡涓嬶細logging.config.dictConfig(config)璇ュ嚱鏁板彲浠ヤ粠涓涓瀛楀吀瀵硅薄涓鑾峰彇鏃ュ織閰嶇疆淇℃伅锛宑onfig鍙傛暟灏辨槸杩欎釜瀛楀吀瀵硅薄銆傚叧浜庤繖涓瀛楀吀瀵硅薄鐨勫唴瀹硅勫垯浼氬湪涓嬮潰杩涜屾弿杩般2. 閰嶇疆瀛楀吀璇存槑鏃犺烘槸涓婇潰鎻愬埌鐨勯厤缃鏂囦欢锛岃繕鏄杩欓噷鐨勯厤缃瀛楀吀锛屽畠浠閮借佹弿杩板嚭鏃ュ織閰嶇疆鎵闇瑕佸垱寤虹殑鍚勭嶅硅薄浠ュ強杩欎簺瀵硅薄涔嬮棿鐨勫叧鑱斿叧绯汇傛瘮濡傦紝鍙浠ュ厛鍒涘缓涓涓鍚嶉濅负鈥渟imple鈥濈殑鏍煎紡鍣╢ormatter锛涚劧鍚庡垱寤轰竴涓鍚嶄负鈥渃onsole鈥濈殑澶勭悊鍣╤andler锛屽苟鎸囧畾璇handler杈撳嚭鏃ュ織鎵浣跨敤鐨勬牸寮忓櫒涓"simple"锛涚劧鍚庡啀鍒涘缓涓涓鏃ュ織鍣╨ogger锛屽苟鎸囧畾瀹冩墍浣跨敤鐨勫勭悊鍣ㄤ负"console"銆浼犻掔粰dictConfig()鍑芥暟鐨勫瓧鍏稿硅薄鍙鑳藉寘鍚涓嬮潰杩欎簺keys锛屽叾涓璿ersion鏄蹇呴』鎸囧畾鐨刱ey锛屽叾瀹僰ey閮芥槸鍙閫夐」锛key鍚嶇О鎻忚堪version蹇呴夐」锛屽叾鍊兼槸涓涓鏁存暟鍊硷紝琛ㄧず閰嶇疆鏍煎紡鐨勭増鏈锛屽綋鍓嶅敮涓鍙鐢ㄧ殑鍊煎氨鏄1formatters鍙閫夐」锛屽叾鍊兼槸涓涓瀛楀吀瀵硅薄锛岃ュ瓧鍏稿硅薄姣忎釜鍏冪礌鐨刱ey涓鸿佸畾涔夌殑鏍煎紡鍣ㄥ悕绉帮紝value涓烘牸寮忓櫒鐨勯厤缃淇℃伅缁勬垚鐨刣ict锛屽俧ormat鍜宒atefmtfilters鍙閫夐」锛屽叾鍊兼槸涓涓瀛楀吀瀵硅薄锛岃ュ瓧鍏稿硅薄姣忎釜鍏冪礌鐨刱ey涓鸿佸畾涔夌殑杩囨护鍣ㄥ悕绉帮紝value涓鸿繃婊ゅ櫒鐨勯厤缃淇℃伅缁勬垚鐨刣ict锛屽俷amehandlers鍙閫夐」锛屽叾鍊兼槸涓涓瀛楀吀瀵硅薄锛岃ュ瓧鍏稿硅薄姣忎釜鍏冪礌鐨刱ey涓鸿佸畾涔夌殑澶勭悊鍣ㄥ悕绉帮紝value涓哄勭悊鍣ㄧ殑閰嶇疆淇℃伅缁勬垚鐨刣cit锛屽俢lass銆乴evel銆乫ormatter鍜宖ilters锛屽叾涓璫lass涓哄繀閫夐」锛屽叾瀹冧负鍙閫夐」锛涘叾浠栭厤缃淇℃伅灏嗕細浼犻掔粰class鎵鎸囧畾鐨勫勭悊鍣ㄧ被鐨勬瀯閫犲嚱鏁帮紝濡備笅闈㈢殑handlers瀹氫箟绀轰緥涓鐨剆tream銆乫ilename銆乵axBytes鍜宐ackupCount绛塴oggers鍙閫夐」锛屽叾鍊兼槸涓涓瀛楀吀瀵硅薄锛岃ュ瓧鍏稿硅薄姣忎釜鍏冪礌鐨刱ey涓鸿佸畾涔夌殑鏃ュ織鍣ㄥ悕绉帮紝value涓烘棩蹇楀櫒鐨勯厤缃淇℃伅缁勬垚鐨刣cit锛屽俵evel銆乭andlers銆乫ilters 鍜 propagate锛坹esroot鍙閫夐」锛岃繖鏄痳oot logger鐨勯厤缃淇℃伅锛屽叾鍊间篃鏄涓涓瀛楀吀瀵硅薄銆傞櫎闈炲湪瀹氫箟鍏跺畠logger鏃舵槑纭鎸囧畾propagate鍊间负no锛屽惁鍒檙oot logger瀹氫箟鐨刪andlers閮戒細琚浣滅敤鍒板叾瀹僱ogger涓奿ncremental鍙閫夐」锛岄粯璁ゅ间负False銆傝ラ夐」鐨勬剰涔夊湪浜庯紝濡傛灉杩欓噷瀹氫箟鐨勫硅薄宸茬粡瀛樺湪锛岄偅涔堣繖閲屽硅繖浜涘硅薄鐨勫畾涔夋槸鍚﹀簲鐢ㄥ埌宸插瓨鍦ㄧ殑瀵硅薄涓娿傚间负False琛ㄧず锛屽凡瀛樺湪鐨勫硅薄灏嗕細琚閲嶆柊瀹氫箟銆俤isable_


赞 (0)