log4net(如何配置Log4Net使用Oracle数据库记录日志)

本文目录
- 如何配置Log4Net使用Oracle数据库记录日志
- 如何使用 log4net 日志框架
- 未能加载文件或程序集“log4net, Version=1.2.10.0, Culture=neutral,
- 如何使用 log4net 日志框架
- log4net为什么只记录了当天的日志
- 在VSCode写.netCore 踩坑记三(log4net日志配置)
- win10程序集缓存log4net这样的问题如何解决
- log4net配置文件解析
- 两个第三方控件引用了不同版本的log4net 怎么处理
- 如何配置和使用log4net日志
如何配置Log4Net使用Oracle数据库记录日志
一、前提条件
系统必须是使用LOG4J进行日志管理,否则方法无效。
系统必须包含commons-logging-xxx.jar,log4j-xxx.jar这两个JAR包,XXX为版本号。
二、操作步骤
1、创建日志表
要把日志持久化,必须在数据库中创建一张用来存储日志信息的表,表内字段为日志
的一个主要属性包括:操作类,执行方法,打印时间,日志级别,日志内容。
CREATE TABLE RESLOG (LOGID VARCHAR2(20) NOT NULL,
CLASS VARCHAR2(200),
METHOD VARCHAR2(100),
CREATETIME DATE,
LOGLEVEL VARCHAR2(50),
MSG VARCHAR2(4000))
因为存储的类为类的全部路径,所以CLASS字段长度需要比较大。
2、日志管理配置
LOG4J主要有两种配置文件.properties和.xml,这里以properties文件为基础来讲
述,关于XML文件的配置,相信大家看完下面的介绍也一样能轻松完成。
通常在LOG4J.PROPERTIES文件的第一行是:
log4j.rootLogger= XXX,这句是控制日志的输出,如果想吧日志输出到数据库,
则需要在XXX中添加“DB”,如log4j.rootLogger=INFO,stdout,Platform,db。上面
这句就是把日志中级别为INFO的信息输出到STDOUT,PLATFORM和DB
(DATABASE)中。
配置好如上的信息,LOG4J就知道用户是想把信息存入数据库,接下来我们就要来
配置数据库的相关信息(包括缓存,数据库连接信息,和执行SQL),配置信息如下:
###JDBCAppender
log4j.appender.db = org.apache.log4j.jdbc.JDBCAppender
//这个配置是选择使用JDBCAppender方法,将日志信息存储到数据库。当然,如果你还要做其他操作,可以自己写个类,继承JDBCAppender就OK了。
log4j.appender.db.BufferSize=1
//这个配置是告诉LOG4J,有多少条日志信息后才存入数据库,我这里是1,就是说有一条就查一条,显然这样在生产环境下是很影响系统性能的。
log4j.appender.db.driver=oracle.jdbc.driver.OracleDriver
//这个配置是告诉LOG4J,做数据库存储所用的驱动。
log4j.appender.db.URL=jdbc:oracle:thin:@《ip》:《port》:《sid》
//这个配置数据库连接的URL,不用说也都知道。
log4j.appender.db.user=XXX
log4j.appender.db.password=XXX
//上面两个是数据库连接时的用户名和密码
log4j.appender.db.sql=insert into RESLOG
(LogId,Class,Method,createTime,LogLevel,MSG)
values (SQ_RESLOG_LOGID.Nextval,’%C’,’%M’,
to_date(’%d{yyyy-MM-dd HH:mm:ss}’,’yyyy-MM-dd
HH24:mi:ss’),’%p’,’%m’)
//这个配置是告诉当LOG4J吧日志存储数据库时用的SQL语句。SQ_RESLOG_LOGID.Nextval是我建的一个SEQUENCE;‘%C’是日志中的CLASS;‘%M’是打印日志是执行到类里的方法;‘%d’是打印的时间,它支持格式化;‘%P’是日志级别,包括INFO、DEBUG、ERROR等;‘%m’是MSG,日志内容。注意这里的参数区分大小写。
log4j.appender.db.layout=org.apache.log4j.PatternLayout
通过上面的配置,现在再启动服务,LOG4J就会自动把原来存储在.LOG文件中的信息,同时存储到数据库了。
如何使用 log4net 日志框架
在项目中配置
第一步:首先在项目中引用log4net.dll文件。
第二步:在Web.config文件中进行添加configSections的节点
第三步:添加log4net配置节点
然后在log4net节点下添加
写入本地文本文件中的配置
注释很清楚,就不解释了。
写入指定邮箱的配置
通过的是163邮箱服务器发送
将日志写入数据库的相关配置,还要建立一张对应的数据库表
另外一种写入文件的方式配置
在log4net节点中还有两个节点
在框架的体系里,所有的日志对象都是根日志(root logger)的后代。
因此如果一个日志对象没有在配置文件里显式定义,则框架使用根日志中定义的属性。在《root》标签里,可以定义level级别值和Appender的列表。如果没有定义LEVEL的值,则缺省为DEBUG。可以通过《appender-ref》标签定义日志对象使用的Appender对象。《appender-ref》声明了在其他地方定义的Appender对象的一个引用。在一个logger对象中的设置会覆盖根日志的设置。而对Appender属性来说,子日志对象则会继承父日志对象的Appender列表。这种缺省的行为方式也可以通过显式地设定《logger》标签的additivity属性为false而改变。
那么上面就会有数据库日志的写入和邮箱的写入
在Global.asax文件初始化配置
调用
运行一下
Log4net中 DEBUG、INFO、WARN、ERROR 区分得很好。正常的 DEBUG、INFO 的日志, 就让它记录在
日志文件里面吧。
对于 WARN、ERROR 级别的日志, 记录到日志文件的同时, 顺便发送电子邮件到我的信箱里面。 这样一来,
我也不必每天去看日志文件, 二来,出了什么问题, 能及时通过电子邮件得到通知。
数据库结构
未能加载文件或程序集“log4net, Version=1.2.10.0, Culture=neutral,
未能加载文件或程序集“log4net, Version=1.2.10.0, Culture=neutral缺失的问题,修复步骤如下:
1、通过一定的途径获取度到canusbdrv.dll文件知,例如网上寻找并下载。
2、将canusbdrv.dll文件复制到“C:\Windows\System32”这个目录下。
3、然后,点击“开道始菜单”中的“运行”按钮,输入:regsvr32 canusbdrv.dll,点击确定。
4、最版,在弹出的安装完成权canusbdrv.dll的提示上,点击确定。
注意事项:
但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。
静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
如何使用 log4net 日志框架
在项目中配置
第一步:首先在项目中引用log4net.dll文件。
第二步:在Web.config文件中进行添加configSections的节点
第三步:添加log4net配置节点
然后在log4net节点下添加
写入本地文本文件中的配置
注释很清楚,就不解释了。
写入指定邮箱的配置
通过的是163邮箱服务器发送
将日志写入数据库的相关配置,还要建立一张对应的数据库表
另外一种写入文件的方式配置
在log4net节点中还有两个节点
在框架的体系里,所有的日志对象都是根日志(root logger)的后代。
因此如果一个日志对象没有在配置文件里显式定义,则框架使用根日志中定义的属性。在《root》标签里,可以定义level级别值和Appender的列表。如果没有定义LEVEL的值,则缺省为DEBUG。可以通过《appender-ref》标签定义日志对象使用的Appender对象。《appender-ref》声明了在其他地方定义的Appender对象的一个引用。在一个logger对象中的设置会覆盖根日志的设置。而对Appender属性来说,子日志对象则会继承父日志对象的Appender列表。这种缺省的行为方式也可以通过显式地设定《logger》标签的additivity属性为false而改变。
那么上面就会有数据库日志的写入和邮箱的写入
在Global.asax文件初始化配置
调用
运行一下
Log4net中 DEBUG、INFO、WARN、ERROR 区分得很好。正常的 DEBUG、INFO 的日志, 就让它记录在
日志文件里面吧。
对于 WARN、ERROR 级别的日志, 记录到日志文件的同时, 顺便发送电子邮件到我的信箱里面。 这样一来,
我也不必每天去看日志文件, 二来,出了什么问题, 能及时通过电子邮件得到通知。
数据库结构
log4net为什么只记录了当天的日志
log4net只记录了当天的日志,原因有以下几种可能:
1、配置问题:检查log4net的配置文件,特别是日期模式(如文件名中的日期格式)和存储位置等配置。如果配置不正确,可能会导致日志只记录到当天,并在新的一天生成一个新的日志文件。
2、日志滚动策略:log4net支持日志滚动策略,例如按文件大小、日期等来分割日志文件。如果配置了按日期滚动,那么日志文件会在每天进行切割,只保留当天的日志。
3、日志级别设置:log4net提供了不同的日志级别(如DEBUG、INFO、ERROR等)。如果只有当天的日志级别达到了配置的要求,才会被记录。您可以检查日志记录语句中的日志级别设置,确认是否将日志级别设置得太高,导致只有当天的日志满足条件。
在VSCode写.netCore 踩坑记三(log4net日志配置)
1、在vscode内输入快捷键 ctrl + shift + P
选择 “NuGet Packge Manager:add package”
安装包:
2、创建一个helpers文件夹用于存放log类
复制以下两个文件到项目上
1、log4net.config 文件存放在根目录
2、LogHelper.cs 文件存放在 helpers 文件夹内
配置后当前目录结构
修改 Program.cs 文件
---------------------------------------重点,重点来了-------------------------------------
build时.netcore不会帮你生成config配置文件(如果有办法请指正),必须自行把log4net.config 复制到生成项目的根目录上
win10程序集缓存log4net这样的问题如何解决
1)开机马上按F8不动到高级选项出现在松手,选“最近一次的正确配置”回车修复,还不行按F8进入安全模式还原一下系统或重装系统(如果重装也是死机,建议还是检修一下去,如果可以进入安全模式,说明你安装了不合适的东西,将出事前下载的不合适东西全部卸载,或还原系统或重装)。
先软后硬,出现这样的问题是软件冲突、驱动不合适、系统问题引起的,可以在安全模式还原一下系统,还是不行重新安装操作系统,不要安装软件、补丁、驱动等,看看开机还有问题吗?如果没有在逐步的安装驱动、补丁、软件,找出不合适的东西就不要安装了。
在有就是硬件引起的,扣出主板电池放一下电,插拔一下内存、显卡清一下灰,在检查硬盘是否有问题,不行就检修一下去吧。
2)如果总是这样,先软后硬,重新安装操作系统,不要安装软件、补丁、驱动等,看看开机还有问题吗?如果没有在逐步的安装驱动、补丁、软件,找出不合适的东西就不要安装了(有问题请你追问我)。
请注意:如果还原系统或重装后,安装驱动、补丁、软件等东西时,一定要将影响你这次出事的东西不要在安装上去了,否则就白还原或重装了。
3)硬件方面,如硬盘、内存等是否出现问题,CPU等硬件的温度是否高,如果是硬件问题引起的,建议检修一下去。
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 % 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 % 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却不会 咋办?用\n\r吗?(我从别人的BLOG上看到过)经实践 \n\r会原样定改日志 根本不会转换 其实 我们可以用XML实体呀 使用 ; ;就可以在指定位置插入一个回车换行符了
最后 像log net的文档中说的那样 如果你不想你的日志文件变得很大 使读写的性能下降的话 建议你还是分级管理日志 把粒度变小点 也就是说 除了定义ROOT外 最后 对每一个模块或每一个实体 依据用途 目的 定义各自的LOGGER配置 这样的好处是日志被分散了 日志文件增长就没那么快了 每一个LOGGER的结构跟ROOT是一模一样的 这里不再叙述了 像前面说的那样 如果你相让日志产生层级关系 你可以跟他们的NAME属性像C#中的namespace那样命名就可以了
要说明的是 LOGGER的定义是非必须的 只是一种建议罢了 Log net的配置中 除了必须定义一个ROOT和一个APPENDER外 其他的都是可选的
lishixinzhi/Article/program/net/201311/11448两个第三方控件引用了不同版本的log4net 怎么处理
启动terminal,运行"python /Cocos/Cocos2d-x-3.0beta2/tools/project-creator/create_project.py"。把工程命名为MaskedCal,然后选择一个文件夹来保存,最后点Create。
接下来,请下载本工程所需要的资源文件并把它们拖到你的Xcode的Resource分组中,确保“Copy items into destination group’s folder (if needed)” 并复选中,然后点Finish。
如何配置和使用log4net日志
1.先弄个日志记录的类
/// 《summary》
/// 使用LOG4NET记录日志的功能,在WEB.CONFIG里要配置相应的节点
/// 《/summary》
public class LogHelper
{
//log4net日志专用
public static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo");
public static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror");
public static void SetConfig()
{
log4net.Config.XmlConfigurator.Configure();
}
public static void SetConfig(FileInfo configFile)
{
log4net.Config.XmlConfigurator.Configure(configFile);
}
/// 《summary》
/// 普通的文件记录日志
/// 《/summary》
/// 《param name="info"》《/param》
public static void WriteLog(string info)
{
if (loginfo.IsInfoEnabled)
{
loginfo.Info(info);
}
}
/// 《summary》
/// 错误日志
/// 《/summary》
/// 《param name="info"》《/param》
/// 《param name="se"》《/param》
public static void WriteLog(string info, Exception se)
{
if (logerror.IsErrorEnabled)
{
logerror.Error(info, se);
}
}
}
2.WEB.CONFIG配置
在 configSections 节点上添加:
《section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /》
然后配置单独的节点:
《!--日志--》
《log4net》
《logger name="logerror"》
《level value="ERROR" /》
《appender-ref ref="ErrorAppender" /》
《/logger》
《logger name="loginfo"》
《level value="INFO" /》
《appender-ref ref="InfoAppender" /》
《/logger》
《appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender"》
《param name="File" value="E:\xxx.com\xx.xxx.com\App_Log\Error\ErrorLog.log" /》
《param name="AppendToFile" value="true" /》
《param name="MaxSizeRollBackups" value="100" /》
《param name="MaximumFileSize" value="1MB" /》
《param name="RollingStyle" value="Size" /》
《param name="StaticLogFileName" value="true" /》
《layout type="log4net.Layout.PatternLayout"》
《param name="ConversionPattern" value="%-5p %d %m%n" /》
《/layout》
《/appender》
《appender name="InfoAppender" type="log4net.Appender.RollingFileAppender"》
《param name="File" value="E:\xxx.com\xxx.xxx.com\App_Log\Info\InfoLog.log" /》
《param name="AppendToFile" value="true" /》
《param name="MaxSizeRollBackups" value="100" /》
《param name="MaximumFileSize" value="1MB" /》
《param name="RollingStyle" value="Size" /》
《param name="StaticLogFileName" value="true" /》
《layout type="log4net.Layout.PatternLayout"》
《param name="ConversionPattern" value="%-5p %d %m%n" /》
《/layout》
《/appender》
《/log4net》
3.在GOLBAL文件里调用写日志:
void Application_Start(object sender, EventArgs e)
{
//在应用程序启动时运行的代码
//初始日志的配置
LogHelper.SetConfig();
}
void Application_Error(object sender, EventArgs e)
{
//在出现未处理的错误时运行的代码
Exception objExp = HttpContext.Current.Server.GetLastError();
string username = "";
string userid = "";
if (Session != null)
{
string.ToString().Split(’|’);
userid = uinfo;
username = uinfo;
}
Aotain114.Public.LogHelper.WriteLog("\r\n用户ID:"+userid+"\r\n用户名:"+username+"\r\n客户机IP:" + Request.UserHostAddress + "\r\n错误地址:" + Request.Url + "\r\n异常信息:" + Server.GetLastError().Message, objExp);
}

本文相关文章:
json时格式自动换行(数据库中数据偶尔有换行符、回车符,在java里取出数据拼JSON格式字符串的时候要出问题)
2025年11月1日 17:45
sqlite3读取性能(csv和sqllite数据库读取哪个快)
2025年10月24日 04:30
java数据库(java中怎么向数据库插入数据(java怎么导入数据库))
2025年10月23日 18:00
数据库逻辑运算符有哪些(智慧芽专利数据库支持哪几种逻辑运算符)
2025年10月22日 00:30
windows7不自带access怎么办(为什么Win7里面数据库access不能用)
2025年10月21日 08:00
sql server 2008合成模板库失败(SQL Server2008数据库引擎等安装失败的原因)
2025年10月9日 08:00
更多文章:
aggressive style 中文(don’t be aggresstive翻译)
2026年4月29日 00:15
简述access数据库的基本功能(Access数据库数据中有哪些基本组件简述他们的基本功能)
2025年6月6日 06:30
js字符串转date类型(js怎么把string转换成date)
2025年8月11日 06:00
computer加er(computer加er的变形是什么意思)
2025年9月1日 14:00
源程序长什么样(c++中什么是源程序什么是编译程序C语言的源程序结构是怎么样的)
2026年9月13日 11:45
ospf协议报文有哪些类型分别是什么作用(OSPF协议有什么作用)
2025年5月27日 09:15
compete的高考考点(高考英语必背C字母开头的单词(5))
2025年12月17日 12:00
js判断页面是否加载完成(js怎么判断div下的内容全部加载完毕)
2025年11月30日 01:15
杨颖极端侮辱(杨颖将自己名誉权获赔款捐赠,你是否能理解她的这般举动)
2025年7月28日 22:00
获取unionid(微信小程序-新用户获取微信手机号登录服务端获取不到unionid情况)
2025年7月20日 08:00















