随笔 - 432  文章 - 0  评论 - 15  阅读 - 63万

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>

  

 

posted on   狼来了  阅读(551)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
阅读排行:
· 10亿数据,如何做迁移?
· 推荐几款开源且免费的 .NET MAUI 组件库
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 易语言 —— 开山篇
· Trae初体验
< 2025年2月 >
26 27 28 29 30 31 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 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示