.net7 控制台使用 log4net
Posted lee429245403
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.net7 控制台使用 log4net相关的知识,希望对你有一定的参考价值。
1.nuget 安装 log4net
2.添加配置文件,以下是在是添加的配置文件,对log4net.config文件右击属性,选择 “复制到输出目录”:始终复制
3.把以下内容拷贝进去
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> </configSections> <log4net> <!--数据日志--> <appender name="InfoRollingFileAppender" type="log4net.Appender.RollingFileAppender"> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <param name="File" value="Log\\Info\\" /> <param name="AppendToFile" value="true" /> <param name="rollingStyle" value="Date" /> <param name="datePattern" value="yyyy-MM-dd.\'Info.log\'" /> <param name="staticLogFileName" value="false" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="记录时间:%date %n日志级别:%-5level %n记录类:%logger%n记录描述:%message%n%n" /> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="INFO" /> <param name="LevelMax" value="INFO" /> </filter> </appender> <!--错误日志--> <appender name="ErrorRollingFileAppender" type="log4net.Appender.RollingFileAppender"> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <param name="File" value="Log\\Error\\" /> <param name="AppendToFile" value="true" /> <param name="rollingStyle" value="Date" /> <param name="datePattern" value="yyyy-MM-dd.\'error.log\'" /> <param name="staticLogFileName" value="false" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="记录时间:%date %n日志级别:%-5level %n出错类:%logger%n错误描述:%message%n%n" /> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="ERROR" /> <param name="LevelMax" value="ERROR" /> </filter> </appender> <!--调试日志--> <appender name="DebugRollingFileAppender" type="log4net.Appender.RollingFileAppender"> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <param name="File" value="Log\\Debug\\" /> <param name="AppendToFile" value="true" /> <param name="rollingStyle" value="Date" /> <param name="datePattern" value="yyyy-MM-dd.\'debug.log\'" /> <param name="staticLogFileName" value="false" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="记录时间:%date %n日志级别:%-5level %n调试类:%logger%n日志描述:%message%n%n" /> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="DEBUG" /> <param name="LevelMax" value="DEBUG" /> </filter> </appender> <root> <level value="DEBUG" /> <!--文件形式记录日志--> <appender-ref ref="ErrorRollingFileAppender" /> <appender-ref ref="DebugRollingFileAppender" /> <appender-ref ref="InfoRollingFileAppender" /> </root> </log4net> </configuration>
4.开始写日志
5.输出日志
.net IPC 不使用端口
【中文标题】.net IPC 不使用端口【英文标题】:.net IPC without using ports 【发布时间】:2014-03-18 00:29:01 【问题描述】:我有一个 IIS ASP.Net Web 服务,它将启动一个 .net 控制台应用程序。我想为控制台应用程序提供优雅的关闭。 (ie) 关闭请求将来自 Web 服务,控制台应用程序将响应并正常关闭。不使用任何端口是否可以做到这一点?
我能想到的一个解决方案是建立从控制台应用程序到 Web 服务的长轮询链接。控制台应用程序是否可以在不使用端口的情况下建立侦听机制?我的部署环境运行了一些安全扫描程序,如果它发现未经批准的开放端口,那就不好了。
【问题讨论】:
【参考方案1】:我本来想说你可以使用一个命名的 Mutex,但是考虑到 ASP.Net 的多线程野兽,你不能保证拥有的线程就是释放它的同一个线程。这可能会导致问题。所以...
最简单的方法可能是使用文件系统。
让控制台应用实例化一个FileSystemWatcher 来监视一个目录,两个进程都可以访问该目录以进行更改,并为Created event 连接一个事件处理程序,如下所示:
internal static bool ShutDownRequested get ; set ;
private static void OnCreated( object sender , FileSystemEventArgs fileSystemEventArgs )
FileSystemWatcher watcher = (FileSystemWatcher) sender ;
ShutDownRequested = true ;
File.Delete( fileSystemEventArgs.FullPath ) ;
watcher.Created -= OnCreated ;
static void Main()
using ( FileSystemWatcher watcher = new FileSystemWatcher( @"\some\common\directory" , "foobar.shutdown.requested" ) )
watcher.Created += OnCreated;
while ( !ShutDownRequested )
DoSomethingUseful() ;
return ;
当您想要关闭控制台应用程序时,只需创建控制台应用程序所期望的文件。控制台应用程序的事件处理程序在工作线程上捕获事件,然后可以设置全局关闭标志,以便主线程可以在第一个合适的时间正常关闭,或者事件处理程序可以简单地调用Environment.Exit(int)
并强制它关闭。不要忘记在完成工作后删除哨兵文件来收拾东西(这是唯一礼貌的做法)。
这就是我会做的,但是,我不喜欢过度思考的事情。
在过度思考时,您可以以类似的方式使用命名事件。在您的 ASP.Net 服务中,创建了一个最初未发出信号的命名事件:
// start console app
EventWaitHandle wh = new EventWaitHandle(false, EventResetMode.ManualReset,"foobar.shutdown.signal");
SpawnConsoleApp() ;
然后,何时关闭控制台应用程序:
// shutdown time
wh.Set() ;
(别忘了把等待把手放在安全的地方)
在您的控制台应用程序中,您需要定期检查信号:
static void Main()
EventWaitHandle wh = EventWaitHandle.OpenExisting( "foobar.shutdown.signal" ) ;
while( !wh.WaitOne(0) )
DoSomethingUseful() ;
wh.Set() ; // acknowledge the signal
return ;
【讨论】:
EventWaitHandle 看起来很有希望【参考方案2】:http://msdn.microsoft.com/en-us/library/bb762927(v=vs.110).aspx
.NET Framework 内置了对命名管道的支持,这是一种不使用端口的 IPC。
使用管道很常见。 Microsoft IIS Admin Service 使用管道与工作进程通信,这是一个示例。
【讨论】:
根据上下文,Windows 命名管道使用 UDP 端口 137/139、TCP/IP 端口 445 或内存映射文件之一。【参考方案3】:我不是 WCF 专家,但 this answer 看起来会有所帮助。他参考了choosing a transport上的这篇 MSDN 文章。
来自那篇文章:
何时使用命名管道传输
... 当需要在单台计算机上的不同 WCF 应用程序之间进行通信,并且您想阻止来自另一台计算机的任何通信时,请使用命名管道传输...
【讨论】:
如果只需要管道,则不需要使用 WCF。 @LexLi 不,但是 WCF 的抽象使它更易于使用。以上是关于.net7 控制台使用 log4net的主要内容,如果未能解决你的问题,请参考以下文章
Log4Net的控制台,WinForm,WebApplication使用