- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章详解log4net的使用由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
程序中只需要引用log4net.dll文件即可 。
配置的引用 。
1
|
log4net.Config.XmlConfigurator.Configure();
|
首先添加以上代码.
CS程序:在Main方法中添加; 。
BS程序:Application_Start方法中添加; 。
或是两者都可以在AssemblyInfo.cs(Properties中)文件里添加以下的语句:
1
2
3
4
|
//设置独立配置文件,log4net.config
[assembly: log4net.Config.XmlConfigurator(ConfigFile =
"log4net.config"
, Watch =
true
)]
//或是默认的配置文件
[assembly: log4net.Config.XmlConfigurator(Watch =
true
)] (配置在web.config文件中)
|
详细配置 。
log4net,可以把日志输出到控制台程序,文件,数据库、邮件,下面贴出四个输出的配置代码,其余如window日志等输出不做阐述.
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
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
configuration
>
<!--首先加入configSections配置节点-->
<
configSections
>
<
section
name
=
"log4net"
type
=
"log4net.Config.Log4NetConfigurationSectionHandler,log4net"
/>
</
configSections
>
<
log4net
><
br
>
<
root
>
<!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) -->
<!--限制日志记录级别-->
<
level
value
=
"all"
/>
<!--将日志输出到文件-->
<
appender-ref
ref
=
"FileAppender"
/>
<!--将日志输出到应用程序控制台-->
<
appender-ref
ref
=
"ConsoleAppender"
/>
<!--将日志写到邮件中-->
<!--<appender-ref ref="LogSmtpAppender"/>-->
<!--将日志记录到数据库中。可以采用SQL和存储过程两种方式-->
<
appender-ref
ref
=
"AdoNetAppender"
/>
<!--可以同时设置多个输出对象,没用到可以注释-->
<!--将日志写到local syslog service (仅用于UNIX环境下)。-->
<!--<appender-ref ref="LocalSyslogAppender"/>-->
</
root
><
br
>
<!--发邮件-->
<
appender
name
=
"LogSmtpAppender"
type
=
"log4net.Appender.SmtpAppender"
>
<
authentication
value
=
"Basic"
/>
<!--接受邮件的邮箱-->
<
to
value
=
"7778888@qq.com"
/>
<!--发送邮件的邮箱-->
<
from
value
=
"123456@126.com"
/>
<!--发送邮件的邮箱-->
<
username
value
=
"123456@126.com"
/>
<!--发送邮件的邮箱密码-->
<
password
value
=
"123456"
/>
<!--标题-->
<
subject
value
=
"XXX应用错误日志消息"
/>
<!--smtp.qq.com-->
<
smtpHost
value
=
"smtp.126.com"
/>
<
bufferSize
value
=
"2048"
/>
<!--超长部分是否丢弃-->
<
lossy
value
=
"true"
/>
<!--日志级别 大于 WARN 的才发邮件-->
<
evaluator
type
=
"log4net.Core.LevelEvaluator"
>
<
threshold
value
=
"ERROR"
/>
</
evaluator
>
<
layout
type
=
"log4net.Layout.PatternLayout"
>
<
conversionPattern
value
=
" %level :: %message %newlineLogger: %logger%newline Date: %date%newline"
/>
</
layout
>
</
appender
><
br
>
<!-- 控制台日志 -->
<
appender
name
=
"ConsoleAppender"
type
=
"log4net.Appender.ConsoleAppender"
>
<
layout
type
=
"log4net.Layout.PatternLayout"
>
<
conversionPattern
value
=
"%n%d{yyyy-MM-dd HH:mm:ss} %m%n"
/>
</
layout
>
<!--指定范围内的等级才可以被记录-->
<!--<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="Info" />
<param name="LevelMax" value="Fatal" />
</filter>-->
</
appender
>
<!--指定日记记录方式,以滚动文件的方式(文件记录)-->
<
appender
name
=
"FileAppender"
type
=
"log4net.Appender.RollingFileAppender"
>
<!--日志路径-->
<
param
name
=
"File"
value
=
"log/"
/>
<!--是否是向文件中追加日志-->
<
param
name
=
"AppendToFile"
value
=
"true"
/>
<!--log保留天数-->
<
param
name
=
"MaxSizeRollBackups"
value
=
"10"
/>
<!--每个文件最大1M-->
<
param
name
=
"maximumFileSize"
value
=
"1MB"
/>
<!--日志文件名是否是固定不变的-->
<
param
name
=
"StaticLogFileName"
value
=
"false"
/>
<!--日志文件名格式为:2008-08-31.log-->
<
param
name
=
"DatePattern"
value
=
"yyyy-MM-dd"
.log""/>
<!--日志根据日期滚动-->
<
param
name
=
"RollingStyle"
value
=
"Date"
/>
<!--布局-->
<
layout
type
=
"log4net.Layout.PatternLayout"
>
<
param
name
=
"ConversionPattern"
value
=
"%n记录时间:%d{yyyy-MM-dd HH:mm:ss} 线程名:[%t] 级别:%p 类名:%c 信息:%m%n"
/>
<
param
name
=
"Header"
value
=
"----------------------------------------------------------- "
/>
</
layout
>
</
appender
><
br
>
<!--数据库日记-->
<
appender
name
=
"AdoNetAppender"
type
=
"log4net.Appender.AdoNetAppender"
>
<!--设置为1方便查看结果,处于性能考虑这里的值应该略大一点,官方默认值是100,BufferSize为缓冲区大小,只有日志记录超设定值才会一块写入到数据库-->
<
bufferSize
value
=
"1"
/>
<!--sqlserver 引用-->
<
connectionType
value
=
"System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
/>
<!--连接数据库字符串-->
<
connectionString
value
=
"data source=.;initial catalog=test;integrated security=false;persist security info=True;User ID=sa;Password=sqlserver;"
/>
<!--插入到表Log-->
<
commandText
value
=
"INSERT INTO LogTest ([Date],[Level],[Logger],[Message],[Exception],[Description],[ObjType]) VALUES (@log_date,@log_level, @logger, @message, @exception,@Description,@ObjType)"
/>
<!--所有参数-->
<
parameter
>
<
parameterName
value
=
"@log_date"
/>
<
dbType
value
=
"DateTime"
/>
<
layout
type
=
"log4net.Layout.RawTimeStampLayout"
/>
</
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
=
"4000"
/>
<
layout
type
=
"log4net.Layout.PatternLayout"
>
<
conversionPattern
value
=
"%message"
/>
</
layout
>
</
parameter
>
<
parameter
>
<
parameterName
value
=
"@exception"
/>
<
dbType
value
=
"String"
/>
<
size
value
=
"2000"
/>
<
layout
type
=
"log4net.Layout.ExceptionLayout"
/>
</
parameter
>
<!--自定义输入字段-->
<
parameter
>
<
parameterName
value
=
"@Description"
/>
<
dbType
value
=
"String"
/>
<
size
value
=
"50"
/>
<
layout
type
=
"log4_Test.Log4netExpand.ExpandLayout"
>
<
conversionPattern
value
=
"%property{Description}"
/>
</
layout
>
</
parameter
>
<
parameter
>
<
parameterName
value
=
"@ObjType"
/>
<
dbType
value
=
"String"
/>
<
size
value
=
"50"
/>
<
layout
type
=
"log4_Test.Log4netExpand.ExpandLayout"
>
<
conversionPattern
value
=
"%property{ObjType}"
/>
</
layout
>
</
parameter
>
</
appender
>
</
log4net
>
</
configuration
>
|
<layout type = "log4_Test.Log4netExpand.ExpandLayout"> 中的log4_Test.Log4netExpand 为命名空间 。
布局、格式字符说明:
%p:输出日志信息的优先级,即DEBUG,INFO,WARN,ERROR,FATAL。 %d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,如:%d{yyyy/MM/dd HH:mm:ss,SSS}。 %r:输出自应用程序启动到输出该log信息耗费的毫秒数。 %t:输出产生该日志事件的线程名。 %l:输出日志事件的发生位置,相当于%c.%M(%F:%L)的组合,包括类全名、方法、文件名以及在代码中的行数。例如:test.TestLog4j.main(TestLog4j.java:10)。 %c:输出日志信息所属的类目,通常就是所在类的全名。 %M:输出产生日志信息的方法名。 %F:输出日志消息产生时所在的文件名称。 %L::输出代码中的行号。 %m::输出代码中指定的具体日志信息。 %n:输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"。 %x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。 %%:输出一个"%"字符。 另外,还可以在%与格式字符之间加上修饰符来控制其最小长度、最大长度、和文本的对齐方式。如: 1)%20c:指定输出category的名称,最小的长度是20,如果category的名称长度小于20的话,默认的情况下右对齐。 2)%-20c:"-"号表示左对齐。 3)%.30c:指定输出category的名称,最大的长度是30,如果category的名称长度大于30的话,就会将左边多出的字符截掉,但小于30的话也不会补空格.
自定义数据库插入字段(源自网络收集、整理) 。
1.先定义一个LogData类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
namespace
log4_Test.Log4netExpand
{
public
class
LogData
{
/// <summary>
/// 日志描述信息
/// </summary>
public
string
Description {
get
;
set
; }
/// <summary>
/// 日志描述信息
/// </summary>
public
string
ObjType {
get
;
set
; }
}
}
|
2.Layout扩展类 。
1
2
3
4
5
6
7
8
9
10
|
namespace
log4_Test.Log4netExpand
{
public
class
ExpandLayout : PatternLayout
{
public
ExpandLayout()
{
this
.AddConverter(
"property"
,
typeof
(MyMessagePatternConverter));
}
}
}
|
3.MyMessagePatternConverter 类 。
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
|
namespace
log4_Test.Log4netExpand
{
public
class
MyMessagePatternConverter: PatternLayoutConverter
{
protected
override
void
Convert(System.IO.TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
{
if
(Option !=
null
)
{
// Write the value for the specified key
WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
}
else
{
// Write all the key value pairs
WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
}
}
/// <summary>
/// 通过反射获取传入的日志对象的某个属性的值
/// </summary>
/// <param name="property"></param>
/// <returns></returns>
private
object
LookupProperty(
string
property, log4net.Core.LoggingEvent loggingEvent)
{
object
propertyValue =
string
.Empty;
PropertyInfo propertyInfo = loggingEvent.MessageObject.GetType().GetProperty(property);
if
(propertyInfo !=
null
)
{
propertyValue = propertyInfo.GetValue(loggingEvent.MessageObject,
null
);
}
return
propertyValue;
}
}
}
|
4.使用代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public
class
Program
{
static
void
Main(
string
[] args)
{
//能看到是那个类输出
ILog logger = log4net.LogManager.GetLogger(
typeof
(Program));
logger.Info(
new
LogData { Description=
"123"
, ObjType=
"123"
})
logger.Info(
"消息11111111111111111111111111111"
);
logger.Warn(
"警告"
);
logger.Error(
"异常"
);
logger.Fatal(
"错误"
);
}
}
|
以上所述是小编给大家介绍的log4net的使用详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。
原文链接:https://www.cnblogs.com/qiuguochao/p/6654149.html 。
最后此篇关于详解log4net的使用的文章就讲到这里了,如果你想了解更多关于详解log4net的使用的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
不同的 LogCat 方法是: Log.v(); // Verbose Log.d(); // Debug Log.i(); // Info Log.w(); // Warning Log.e();
在android群里,经常会有人问我,android log是怎么用的,今天我就把从网上以及sdk里东拼西凑过来,让大家先一睹为快,希望对大家入门android log有一定的帮助. android
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 社区 12
我正在尝试使用 sonarlint 检查代码质量.上面的问题概要,我不明白为什么它要说要大写。但是 this discussion与上述建议相反。哪一个应该被认为是正确的? 最佳答案 这没有正确答案,
随着 n 变大,log*(log n) 和 log(log* n) 这两个函数会更快吗? 这里,log* 函数是迭代对数,定义如下: 我怀疑它们是相同的,只是写法不同,但它们之间有什么区别吗? 最佳答
作为家庭作业,我被要求在 O(log(n)) 中编写一个算法,我可以计算出我编写的算法的复杂度为 O(log(n) + log(n/2) + log(n/4) + log(n/8) + ... + l
我正在使用 Tomee。日志文件夹包含这样的文件 localhost_access_log.2016-12-02.txt localhost.2016-12-02.log catalina.2016-
Android Log.v、Log.d、Log.i、Log.e 等的 ios 等效项是什么?同样在 android 上,我使用 Android 设备监视器和 logcat 来访问我的手机日志,我需要在
我认为下面的代码是 O(log log n) 因为它里面有 i*i 但我对 log n 感到困惑> 和 log (log n)。 for (i=2; i*i<=number; i++) { if
我正在修改 kvm 模块,并在内核代码中添加了 printk 语句。运行虚拟机后,printk 为我提供了错误地址和有关 guest 操作系统的其他信息。 我需要从这个信息中生成统计信息。当我使用 d
我有一个部署为 Windows Azure Web 角色的 WCF 服务。 我正在使用 Enterprise Library 进行异常处理,并且在我的本地 Development Fabric 中,似
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
在 Go 的生产中使用 log.SetFlags(log.LstdFlags | log.Lshortfile) 是好的做法(至少是一般做法)吗?我想知道在生产中这样做是否存在性能或安全问题。因为它不
我想知道什么更快: double value = Math.log(a) - Math.log(b); 或 double value = Math.log(a/b); 我计算值的方式是否会对性能产生影
我有数百个子例程使用 log.Println() 写入日志文件 我正在使用 log.Println 写入 error.log 文件。 func main() { e, err := os.Open
我将 Nuxt 与 SSR 一起使用,并希望有类似于 apaches 的 access.log 和 error.log 的东西 我特别感兴趣的是每次调用的响应时间。 我在 nuxt 文档中找不到任何内
我知道以前有人问过这个问题,但我相信这是一个不同的问题。 Nginx 在 www-data 下运行: $ ps -eo "%U %G %a" | grep nginx root root
我在我的日志文件中发现了一个非常奇怪的条目 Jan 29 01:35:30 vs-proj-handy sshd[5316]: Received disconnect from 130.207.203
对于我正在开发的应用程序,我希望在开发过程中和发布时简化故障排除。我希望能够检索到对 Log 的调用,以了解在 USB 调试中没有连接手机的情况下运行应用程序时的调用,以便可以检索并发送给我。例如,当
我试图捕获 panic 并记录错误: func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloRep
我是一名优秀的程序员,十分优秀!