Item1#:
Repository
组件在不同版本的不同之处?
Answer
:
Repository
主要是负责对日志对象的组织结构的维护。在
log4net
的以前版本中,框架仅支持分等级的组织结构。这种等级结构本质上是库的一个实现,并且定义在
log4net.Repository.Hierarchy
名字空间中。要实现一个
Repository
,需要实现
log4net.Repository.ILoggerRepository
接口。现在已经改用
LogManager
类来实现这个功能。
Item2#:
日志文件输出到多个位置的研究(例如:不同介质、同介质不同地方、同介质远程不同主机)
Answer
:
日志文件可以输出到多个不同的介质,例如我们常用的数据库、文件;同时也可以以一种介质的形式输出到多个位置;以相同
/
不同的介质形式而保存到相同
/
不同的远程的主机上。
下面我们举例实现同介质远程不同主机:
Log4net
使用
RomtingAppender
的形式实现的,以运行程序的主机作为
client
,远程主机作为
server
,启动
server
并监听相应的端口,当
client
触发相应的事件,就会把
message
发送到
server
主机上,
server
主机把收集到的
message
以某种
appender
形式保存。
具体请参考
log4net
自带的
sample
:
E:\log4.net\incubating-log4net-1.2.9-beta\examples\net\1.0\Remoting
在
RemotingClient
程序中相应模拟我们运行的程序,下面我们修改了
App.config
文件实现多个
server
收集信息:
<?
xml
version
="1.0"
encoding
="utf-8"
?>
<!
--
.NET application configuration file
This file must have the exact same name as your application with
.config appended to it. For example if your application is testApp.exe
then the config file must be testApp.exe.config it mut also be in the
same diectory as the
application.
--
>
<
configuration
>
<!
-- Register a section handler for the log4net section --
>
<
configSetions
>
®
<
section
name
="log4net"
type
="System.Configuration.IgnoreSectionHandler"
/>
</
configSertions
>
<!
-- This sectin contains the log4net configuration settings --
>
Ô
<
log4net
debug
="false">
<!
-- Define some output appenders --
>
<!
-- Use the remoting appender --
>
<appender name="RemotingAppender1" type="log4net.Appender.RemotingAppender" >
<!
-- The remoting URL to theeremoting server object --
>
<!
--sink value="tcp://192.168.0.239:8085/LoggingSink" /--
>
<sink value="tcp://192.168.0.230:8085/LoggingSink" />
<!
-- Send all events, do notediscard events when the buffer is full --
>
<
lossy
value
="false"
/>
<!
-- The numbe of events to
buffer before sending --
>
<
bufferSize
value
="95"
/>
<!
-- Do not store event dataethat is slow to generate --
>
<
onlyFixPartialEventData
value
="true"
/>
<!
-- Specify an evaluator toesend the events immediatly under
ertain conditions, e.g. when an error event ocurrs --
>
Þ
<!
--
<evaluato type="log4net.Core.LevelEvaluator">
£
<threshold value="ERROR"/>
</evaluator>
--
>
</
appender
>
<appender name="RemotingAppender2" type="log4net.Appender.RemotingAppender" >
<!
-- The remoting URL to theeremoting server object --
>
<sink value="tcp://192.168.0.239:8085/LoggingSink" />
<!
--sink value="tcp://192.168.0.230:8085/LoggingSink" /--
>
<!
-- Send all events, do notediscard events when the buffer is full --
>
<
lossy
value
="false"
/>
<!
-- The numbe of events to
buffer before sending --
>
<
bufferSize
value
="95"
/>
<!
-- Do not store event dataethat is slow to generate --
>
<
onlyFixPartialEventData
value
="true"
/>
<!
-- Specify an evaluator toesend the events immediatly under
Rertain conditions, e.g. when an error event ocurrs --
>
<!
--
<evaluato{ type="log4net.Core.LevelEvaluator">
<threshold value="ERROR"/>
</evaluator>
--
>
</
appender
>
<!
-- Setup the root category, add the appenders and set the default priority --
>
<
root
>
<
level
value
="DEBUG"
/>
<appender-ref ref="RemotingAppender2" />
<appender-ref ref="RemotingAppender1" />
</
root
>
</
log4net
>
</
configuration
>
同样我们修改
RemotingServer
的
App.config
文件实现一个
server
上收集的信息以多种介质保存:
<?
xml
version
="1.0"
encoding
="utf-8"
?>
<
configuration
>
<!
-- Register a section handler for the log4net section --
>
<
configSections
>
<
section
name
="log4net"
type
="System.Configuration.IgnoreSectionHandler"
/>
</
configSections
>
<!
-- This section contains the log4net configuration settings --
>
<
log4net
>
<
appender
name
="ConsoleAppender"
type
="log4net.Appender.ConsoleAppender">
<
layout
type
="log4net.Layout.PatternLayout">
<
conversionPattern
value
="%date [%thread] %-5levele%logger (%property{log4net:HostName}) [%ndc] - %message%newline"
/>
</
layout
>
</
appender
>
<
appender
name
="LogFileAppender"
type
="log4net.Appender.FileAppender">
<
file
value
="log-file.txt"
/>
<
sppendToFile
value
="true"
/>
<
layout
type
="log4net.Layout.PatternLayout">
<
header
value
="FILE HEADER "
/>
<
footer
value
="FILE FOOTER "
/>
<
conversionPattern
value
="%date [%thread] %-5levele%logger (%property{log4net:HostName}) [%ndc] - %message%newline"
/>
</
layout
>
</
appender
>
<
root
>
<
level
value
="DEBUG"
/>
<
appender-ref
ref
="ConsoleAppender"
/>
<
appender-ref
ref
="LogFileAppender"
/>
</
root
>
</
log4net
>
<
system.runtime.remoting
>
<
application
name
="Log4netRemotingServer">
<!
-- We need to define the remoting channels on which we will publish
the remote logging sink. --
>
<
channels
>
<
channel
displayName
="Server Channel"
ref
="tcp server"
port
="8085"
/>
</
channels
>
</
application
>
</
system.runtime.remoting
>
</
configuration
>
Item3#:
Log level
和
Filter level
相互之间的影响,会产生交集吗?
Answer
:
Log level
是我们定义
logger
的时候使用的,同时在
logger
定义同时也定义了输出介质,在每个输出介质中,我们定义了
Filter Level
来过滤我们不要的信息。所以
log level
和
filter level
是会产生交集的。
Item4#:
[Assembly:
log4net.Config.XmlConfigurator(ConfigFile="log4net.config", Watch=true)]
的内部机制
Answer
:
这个语句我们是使用在项目中的
AssemblyInfo.cs
文件,用来加载我们定义的配置文件到项目中;如果使用项目的默认配置文件
App.config
文件:
[Assembly:
log4net.Config.XmlConfigurator()]
。
ConfigFile
定义了日志配置文件的路径,Watch定义了检查配置文件是否有改变。
Item5#:
日志输出格式的问题,有没有辅助工具可以对
log
的内容进行提取和过滤。
(例如:对
log
文件进行过滤,是开发人员获得各自所负责模块的信息)
Answer
: