webapi使用log4net在release模式下无法生成文件的解决方案
为 WebAPI 添加 log4net 日志功能,
LogNet 的配置信息, 网络几乎都是和 Web.Config 写在一起啊的 。
今天发布一个webapi,在Debug模式一切正常,但是在release模式下log4net不工作,查了很多资料,终于解决。具体做如下检查修改。
1.从nuget下载log4net
2.一个log4net.config文件,各个节点的意义详细查询api,这是产生文件的路径“logs/info/2020/202003/20200301.log”,logs目录下日志分会按debug,error,fatal,info,warn来存在日志。
log4net.config配置内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 | <?xml version= "1.0" encoding= "utf-8" ?> <configuration> <configSections> <!--配置一个结点 名称为log4net--> <section name= "log4net" type= "log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <log4net> <root> <!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF--> <!--比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录--> <!--如果没有定义LEVEL的值,则缺省为DEBUG--> <level value= "ALL" /> <appender- ref ref = "INFOAppender" /> <appender- ref ref = "DEBUGAppender" /> <appender- ref ref = "WARNAppender" /> <appender- ref ref = "ERRORAppender" /> <appender- ref ref = "FATALAppender" /> <appender- ref ref = "ColoredConsole" /> <appender- ref ref = "TraceAppender" /> <appender- ref ref = "ADONetAppender_SqlServer" /> </root> <!--写入到文件--> <appender name= "INFOAppender" type= "log4net.Appender.RollingFileAppender" > <file value= "logs\\info\\" /> <appendToFile value= "true" /> <rollingStyle value= "Composite" /> <datePattern value= "yyyy\\yyyyMM\\yyyyMMdd'.log'" /> <staticLogFileName value= "false" /> <maxSizeRollBackups value= "100" /> <maximumFileSize value= "10MB" /> <layout type= "log4net.Layout.PatternLayout" > <!--"%d %t %p %l %m %n”: 1、%d输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss},输出类似:2005-7-19 17:49:27,刚好适合插入SQLServer; 2、%t 产生该日志事件的线程名; 3、%p 日志的log_level,如DEBUG、WARN或者INFO; 4、%c 输出所属的类目,通常就是所在类的全名,如“iNotes.Default”; 5、%m 日志的内容; 6、%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。如write2database.main(write2database.java:33); 7、%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n” --> <conversionPattern value= "%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> <filter type= "log4net.Filter.LevelRangeFilter" > <param name= "LevelMin" value= "INFO" /> <param name= "LevelMax" value= "INFO" /> </filter> </appender> <appender name= "DEBUGAppender" type= "log4net.Appender.RollingFileAppender" > <file value= "logs\\debug\\" /> <appendToFile value= "true" /> <rollingStyle value= "Composite" /> <datePattern value= "yyyy\\yyyyMM\\yyyyMMdd'.log'" /> <staticLogFileName value= "false" /> <maxSizeRollBackups value= "100" /> <maximumFileSize value= "10MB" /> <layout type= "log4net.Layout.PatternLayout" > <conversionPattern value= "%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> <filter type= "log4net.Filter.LevelRangeFilter" > <param name= "LevelMin" value= "DEBUG" /> <param name= "LevelMax" value= "DEBUG" /> </filter> </appender> <appender name= "WARNAppender" type= "log4net.Appender.RollingFileAppender" > <file value= "logs\\warn\\" /> <appendToFile value= "true" /> <rollingStyle value= "Composite" /> <datePattern value= "yyyy\\yyyyMM\\yyyyMMdd'.log'" /> <staticLogFileName value= "false" /> <maxSizeRollBackups value= "100" /> <maximumFileSize value= "10MB" /> <layout type= "log4net.Layout.PatternLayout" > <conversionPattern value= "%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> <filter type= "log4net.Filter.LevelRangeFilter" > <param name= "LevelMin" value= "WARN" /> <param name= "LevelMax" value= "WARN" /> </filter> </appender> <appender name= "ERRORAppender" type= "log4net.Appender.RollingFileAppender" > <file value= "logs\\error\\" /> <appendToFile value= "true" /> <rollingStyle value= "Composite" /> <datePattern value= "yyyy\\yyyyMM\\yyyyMMdd'.log'" /> <staticLogFileName value= "false" /> <maxSizeRollBackups value= "100" /> <maximumFileSize value= "10MB" /> <layout type= "log4net.Layout.PatternLayout" > <conversionPattern value= "%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> <filter type= "log4net.Filter.LevelRangeFilter" > <param name= "LevelMin" value= "ERROR" /> <param name= "LevelMax" value= "ERROR" /> </filter> </appender> <appender name= "FATALAppender" type= "log4net.Appender.RollingFileAppender" > <file value= "logs\\fatal\\" /> <appendToFile value= "true" /> <rollingStyle value= "Composite" /> <datePattern value= "yyyy\\yyyyMM\\yyyyMMdd'.log'" /> <staticLogFileName value= "false" /> <maxSizeRollBackups value= "100" /> <maximumFileSize value= "10MB" /> <layout type= "log4net.Layout.PatternLayout" > <conversionPattern value= "%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> <filter type= "log4net.Filter.LevelRangeFilter" > <param name= "LevelMin" value= "FATAL" /> <param name= "LevelMax" value= "FATAL" /> </filter> </appender> <appender name= "TraceAppender" type= "log4net.Appender.TraceAppender" > <layout type= "log4net.Layout.PatternLayout" > <param name= "conversionPattern" value= "%newline*******************************************%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline*******************************************%newline" /> </layout> </appender> <!--将日记写入数据库--> <appender name= "ADONetAppender_SqlServer" type= "log4net.Appender.ADONetAppender" > <bufferSize value= "0" /> <connectionType value= "System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <connectionString value= "Server=192.168.4.253;Database=SOADB;User Id=sa;Password=qwer1234;" /> <commandText value= "INSERT INTO UDT_SYS_Log([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" /> <parameter> <parameterName value= "@log_date" /> <dbType value= "DateTime" /> <layout type= "log4net.Layout.RawTimeStampLayout" /> </parameter> <parameter> <parameterName value= "@thread" /> <dbType value= "String" /> <size value= "255" /> <layout type= "log4net.Layout.PatternLayout" > <conversionPattern value= "%thread" /> </layout> </parameter> <parameter> <parameterName value= "@log_level" /> <dbType value= "String" /> <size value= "50" /> <layout type= "log4net.Layout.PatternLayout" > <conversionPattern value= "%level" /> </layout> </parameter> <parameter> <parameterName value= "@logger" /> <dbType value= "String" /> <size value= "255" /> <layout type= "log4net.Layout.PatternLayout" > <conversionPattern value= "%logger" /> </layout> </parameter> <parameter> <parameterName value= "@message" /> <dbType value= "String" /> <size value= "2000" /> <layout type= "log4net.Layout.PatternLayout" > <conversionPattern value= "%message" /> </layout> </parameter> <parameter> <parameterName value= "@exception" /> <dbType value= "String" /> <size value= "4000" /> <layout type= "log4net.Layout.ExceptionLayout" /> </parameter> </appender> </log4net> </configuration> |
一般都是在AssemblyInfo.cs文件中写入如下代码
1 | [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config" , ConfigFileExtension = "config" , Watch = true )] |
如图:
但这个方式在Debug模式下没有问题,但是在release模式下就不好用了,需要在Global.asax文件中具体再次指定配置文件所在位置,例如:
1 | log4net.Config.XmlConfigurator.Configure( new FileInfo(Server.MapPath( "~" ) + @"\log4net.config" )); |
如图:
重新编译发布就可以了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 | <?xml version= "1.0" encoding= "utf-8" ?> <configuration> <configSections> <!--配置一个结点 名称为log4net--> <section name= "log4net" type= "log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <log4net> <root> <!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF--> <!--比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录--> <!--如果没有定义LEVEL的值,则缺省为DEBUG--> <level value= "ALL" /> <appender- ref ref = "INFOAppender" /> <appender- ref ref = "DEBUGAppender" /> <appender- ref ref = "WARNAppender" /> <appender- ref ref = "ERRORAppender" /> <appender- ref ref = "FATALAppender" /> <appender- ref ref = "ColoredConsole" /> <appender- ref ref = "TraceAppender" /> <appender- ref ref = "ADONetAppender_SqlServer" /> </root> <!--写入到文件--> <appender name= "INFOAppender" type= "log4net.Appender.RollingFileAppender" > <file value= "logs\\info\\" /> <appendToFile value= "true" /> <rollingStyle value= "Composite" /> <datePattern value= "yyyy\\yyyyMM\\yyyyMMdd'.log'" /> <staticLogFileName value= "false" /> <maxSizeRollBackups value= "100" /> <maximumFileSize value= "10MB" /> <layout type= "log4net.Layout.PatternLayout" > <!--"%d %t %p %l %m %n”: 1、%d输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss},输出类似:2005-7-19 17:49:27,刚好适合插入SQLServer; 2、%t 产生该日志事件的线程名; 3、%p 日志的log_level,如DEBUG、WARN或者INFO; 4、%c 输出所属的类目,通常就是所在类的全名,如“iNotes.Default”; 5、%m 日志的内容; 6、%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。如write2database.main(write2database.java:33); 7、%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n” --> <conversionPattern value= "%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> <filter type= "log4net.Filter.LevelRangeFilter" > <param name= "LevelMin" value= "INFO" /> <param name= "LevelMax" value= "INFO" /> </filter> </appender> <appender name= "DEBUGAppender" type= "log4net.Appender.RollingFileAppender" > <file value= "logs\\debug\\" /> <appendToFile value= "true" /> <rollingStyle value= "Composite" /> <datePattern value= "yyyy\\yyyyMM\\yyyyMMdd'.log'" /> <staticLogFileName value= "false" /> <maxSizeRollBackups value= "100" /> <maximumFileSize value= "10MB" /> <layout type= "log4net.Layout.PatternLayout" > <conversionPattern value= "%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> <filter type= "log4net.Filter.LevelRangeFilter" > <param name= "LevelMin" value= "DEBUG" /> <param name= "LevelMax" value= "DEBUG" /> </filter> </appender> <appender name= "WARNAppender" type= "log4net.Appender.RollingFileAppender" > <file value= "logs\\warn\\" /> <appendToFile value= "true" /> <rollingStyle value= "Composite" /> <datePattern value= "yyyy\\yyyyMM\\yyyyMMdd'.log'" /> <staticLogFileName value= "false" /> <maxSizeRollBackups value= "100" /> <maximumFileSize value= "10MB" /> <layout type= "log4net.Layout.PatternLayout" > <conversionPattern value= "%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> <filter type= "log4net.Filter.LevelRangeFilter" > <param name= "LevelMin" value= "WARN" /> <param name= "LevelMax" value= "WARN" /> </filter> </appender> <appender name= "ERRORAppender" type= "log4net.Appender.RollingFileAppender" > <file value= "logs\\error\\" /> <appendToFile value= "true" /> <rollingStyle value= "Composite" /> <datePattern value= "yyyy\\yyyyMM\\yyyyMMdd'.log'" /> <staticLogFileName value= "false" /> <maxSizeRollBackups value= "100" /> <maximumFileSize value= "10MB" /> <layout type= "log4net.Layout.PatternLayout" > <conversionPattern value= "%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> <filter type= "log4net.Filter.LevelRangeFilter" > <param name= "LevelMin" value= "ERROR" /> <param name= "LevelMax" value= "ERROR" /> </filter> </appender> <appender name= "FATALAppender" type= "log4net.Appender.RollingFileAppender" > <file value= "logs\\fatal\\" /> <appendToFile value= "true" /> <rollingStyle value= "Composite" /> <datePattern value= "yyyy\\yyyyMM\\yyyyMMdd'.log'" /> <staticLogFileName value= "false" /> <maxSizeRollBackups value= "100" /> <maximumFileSize value= "10MB" /> <layout type= "log4net.Layout.PatternLayout" > <conversionPattern value= "%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> <filter type= "log4net.Filter.LevelRangeFilter" > <param name= "LevelMin" value= "FATAL" /> <param name= "LevelMax" value= "FATAL" /> </filter> </appender> <appender name= "TraceAppender" type= "log4net.Appender.TraceAppender" > <layout type= "log4net.Layout.PatternLayout" > <param name= "conversionPattern" value= "%newline*******************************************%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline*******************************************%newline" /> </layout> </appender> <!--将日记写入数据库--> <appender name= "ADONetAppender_SqlServer" type= "log4net.Appender.ADONetAppender" > <bufferSize value= "0" /> <connectionType value= "System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <connectionString value= "Server=192.168.40.253;Database=SOADB;User Id=sa;Password=qwer1234;" /> <commandText value= "INSERT INTO UDT_SYS_Log([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" /> <parameter> <parameterName value= "@log_date" /> <dbType value= "DateTime" /> <layout type= "log4net.Layout.RawTimeStampLayout" /> </parameter> <parameter> <parameterName value= "@thread" /> <dbType value= "String" /> <size value= "255" /> <layout type= "log4net.Layout.PatternLayout" > <conversionPattern value= "%thread" /> </layout> </parameter> <parameter> <parameterName value= "@log_level" /> <dbType value= "String" /> <size value= "50" /> <layout type= "log4net.Layout.PatternLayout" > <conversionPattern value= "%level" /> </layout> </parameter> <parameter> <parameterName value= "@logger" /> <dbType value= "String" /> <size value= "255" /> <layout type= "log4net.Layout.PatternLayout" > <conversionPattern value= "%logger" /> </layout> </parameter> <parameter> <parameterName value= "@message" /> <dbType value= "String" /> <size value= "2000" /> <layout type= "log4net.Layout.PatternLayout" > <conversionPattern value= "%message" /> </layout> </parameter> <parameter> <parameterName value= "@exception" /> <dbType value= "String" /> <size value= "4000" /> <layout type= "log4net.Layout.ExceptionLayout" /> </parameter> </appender> </log4net> </configuration> |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 10亿数据,如何做迁移?
· 推荐几款开源且免费的 .NET MAUI 组件库
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 易语言 —— 开山篇
· Trae初体验