c#.NET中日志信息写入Windows日志中解决方案

1、 目的  
应用系统的开发和维护离不开日志系统,选择一个功能强大的日志系统解决方案是应用系统开发过程中很重要的一部分。在.net环境下的日志系统解决方案有许多种,log4net是其中的佼佼者。 
在Windows2000及以上操作系统中,有一个Windows日志系统,它包括应用程序(Application)事件日志、系统(System)日志和安全(Security)日志,事件日志也可以是自定义日志。在.net Framework中也提供了相应的类和接口来使用应用程序事件日志或者自定义事件日志。使用Windows日志可以使应用系统与操作系统更好的结合,与单纯使用自定义的日志系统相比,因为有了操作系统的支持,查询和管理日志更方便。在实际应用中,根据实际情况,可以选择一种合适的日志解决方案,也可以自定义日志系统和Windows日志系统两种日志解决方案同时使用。 
2、 使用Windows日志的方法  
2.1、方法概述  
在.net Framework中提供了一个类EventLog,使用EventLog类可以添加新的事件日志条目或从服务器事件日志中获取已有的条目。EventLog类包括一个WriteEntry()方法,可以用它来把一个新的事件写入到事件日志中。在写入一个新的条目到事件日志时,是使用特定的事件源(event source)来把条目写入到特定的事件日志中。 
事件源对于事件日志而言是唯一的。在Windows2000及以上操作系统中,包括一个事件日志:应用程序(Application)事件日志,还有系统(System)日志和安全(Security)日志,并且系统允许自定义事件日志。使用EventLog类,可以将日志条目添加到应用程序(Application)事件日志中,也可以添加到自定义事件日志中。事件源相当于事件日志的下一级目录,每一条日志条目都必须对应一个事件源。EventLog类可以创建一个自定义事件日志,也可以创建一个事件源,事件源可以创建在应用程序(Application)事件日志中,也可以创建在自定义事件日志中。Windows日志系统如下图所示:
为了便于不同应用系统之间的日志区分和查看方便,一般将事件源创建在自定义事件日志中,可以创建多个事件日志,一个事件日志也可以创建多个事件源。
2.2、事件日志和事件源创建方法 
创建一个新的事件日志或事件源时,其实是在对注册表添加一个条目。由于写注册表要求特殊的权限,所以在Web项目中创建事件日志和事件源就存在权限和安全的问题,Application项目中不存在此问题,本文重点讲述Web项目中Windows日志使用方法,Application项目中的使用方法类似于Web项目,抛弃掉Web项目中的权限和安全处理即可,本文不再赘述。
在Web项目中,当使用asp.net向系统中创建一个事件日志或者一个事件源时,可能会得到如下异常错误消息: System.Security.SecurityException: 不允许所请求的注册表访问权。这是因为运行asp.net进程的默认帐户是ASPNET(在IIS6.0下面是NetworkService),而此账户默认只有读权限,没有写权限,所以不能创建事件日志或事件源。解决此问题的办法有提升ASPNET帐户的权限、不在程序内部创建事件日志或事件源等,主要有以下三种解决方案:
A、  在程序运行之前,定义要使用的事件日志和事件源,打开注册表编辑器,手工将事件日志和事件源添加到注册表中。主要步骤如下:
①     点击“开始”菜单,再点击“运行”。
②     在“运行”的“打开”框中输入“regedit”,然后按OK按钮,打开注册表编辑器。
③     在注册表编辑器中找到下列子键:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog
④     右键单击“Eventlog”,点击“新建”,再点“项”,将在“Eventlog”的下一级创建一个新的项目,将此项目命名为“TDDN”, TDDN项就是事件日志,可以根据实际情况为此项命名,比如可以命名为项目名称。
⑤     在“TDDN”项上单击右键,点击“新建”,再点“项”,将在“TDDN”的下一级创建一个新的项,将此项命名为“Weblog”, Weblog项就是事件源,此项也可以根据实际情况命名。
⑥     关闭注册表编辑器。
这样事件日志和事件源就建好了,如果需要多个事件日志或事件源,重复以上过程。这种方法要求对注册表比较熟悉,操作起来可能有一点复杂,可以写一个类来实现配置注册表,只要运行该类便可添加相应的项目,免除了手工添加的繁琐,这是第二种解决方案,方法如下:
B、  在System.Diagnostics命名空间中有一个EventLogInstaller类,它能够创建和配置应用程序在运行时要读写的事件日志和事件源。通过下列步骤,便能够使用EventLogInstaller类来创建一个事件日志和事件源:
①     用C#来创建一个名为EventLogSourceInstaller的“类库”。
②     在此项目中添加对System.Configuration.Install.dll的引用。
③     将自动产生的Class1.cs更名为MyEventLogInstaller.cs。
④     在MyEventLogInstaller.cs中的写入以下代码:
using System;
using System.Diagnostics;
using System.ComponentModel;
using System.Configuration.Install;
namespace EventLogSourceInstaller {
[RunInstaller(true)]
public class MyEventLogInstaller: Installer{
public  EventLogInstaller myEventLogInstaller;
public MyEventLogInstaller(){
//Create Instance of EventLogInstaller
myEventLogInstaller = new EventLogInstaller();
// Set the Source of Event Log, to be created.
myEventLogInstaller.Source = "WebLog";
// Set the Log that source is created in
myEventLogInstaller.Log = "TDDN";
Installers.Add(myEventLogInstaller);
}
}
}
⑤     生成此项目,得到EventLogSourceInstaller.dll。
⑥     打开Visual Studio .NET 命令提示,转到EventLogSourceInstaller.dll所在目录。
⑦     运行此命令来创建事件日志和事件源,运行方法为:输入命令InstallUtil EventLogSourceInstaller.dll。
这样程序就在系统中创建一个事件日志:TDDN,在事件日志TDDN下创建了一个事件源:WebLog。
以上的这两种解决方案都是在应用系统运行之前,为系统手工添加事件日志和事件源,这样做没有安全权限问题,不存在安全隐患。更方便的方法还可以在应用系统运行时,让程序自动创建事件日志和事件源,这种方法必须提升ASPNET帐户的系统操作权限,或者给asp.net进程一个有更大权限的模拟帐号。模拟帐号的实现比较复杂,而且功能和安全性上和提升ASPNET帐户没有区别,这里采用的方法是提升ASPNET帐户的权限。以下是第三种解决方案:
C、  提升ASPNET帐户的权限可以直接在Windows系统管理中给ASPNET帐户添加对系统的读写权限,但是这样做存在很严重的安全问题,asp.net进程有直接读写操作系统的权限,将给系统带来很大的安全隐患。这里采用的提升ASPNET帐户权限的方法是只将系统日志的操作权限赋给ASPNET帐户,这样虽然还存在一定的安全隐患,但是隐患已经大大降低,并且可以在程序内部自由创建事件日志和事件源,极大的提高了灵活性。ASPNET帐户权限提升方法如下:
①     点击“开始”,“运行”,输入“regedit”,打开注册表编辑器。
②     在注册表编辑器中找到下列子键:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog
③     在Eventlog项目上单击右键,在弹出的菜单中选择“访问许可”选项,然后找到本机的ASPNET帐户加进来,并赋予读写权限。
这样,ASPNET帐户就有了读写系统日志的权限,就可以在程序中根据情况自由创建事件日志和事件源了。在程序中创建事件日志和事件源的方法如下:
调用 EventLog类的CreateEventSource 方法并指定数据源字符串和要创建的事件日志名称,如果将事件日志名称指定为空 (""),事件日志名称将默认为Application,这样不会创建新事件日志,但会为应用程序(Application)事件日志创建指定的数据源。如果创建一个新的事件日志,则在确定事件日志名称是否唯一时将只计算指定字符串的前8 个字母。如下代码所示:
System.Diagnostics.EventLog.CreateEventSource("WebLog", "TDDN");
将创建一个事件日志为TDDN,在该事件日志下创建一个事件源WebLog。要在远程计算机上创建自定义事件日志,要将此计算机名指定为第三个参数。以下代码提供了一个示例:
System.Diagnostics.EventLog.CreateEventSource(" WebLog ", " TDDN ", "myserver");
将在远程计算机myserver上创建该事件日志和事件源。
2.3、写入Windows日志的方法 
事件日志与事件源创建的问题解决了,接下来就可以在程序中将日志信息写入到Windows系统日志中了。写入方法是,首先创建EventLog类的一个实例,将其Source属性与事件源名称相关联,最后调用WriteEntry方法来往事件日志中添加日志信息。下面是一段写入系统日志的简单示例代码:
EventLog eventLog = null;
if (!(EventLog.SourceExists("WebLog"))){            
EventLog.CreateEventSource("WebLog", "TDDN");
}
if (eventLog == null){
eventLog = new EventLog("TDDN");
eventLog.Source = "WebLog";

eventLog.WriteEntry("This is error!", EventLogEntryType.Error);
}
上面程序段中首先判断数据源“WebLog”是否存在,如果不存在调用CreateEventSource方法创建该事件源,然后将事件源与EventLog 类的Source属性关联,进行写操作。传递给WriteEntry方法的第一个参数代表要记录的日志消息,可以写入任何消息。第二个参数代表事件日志的类型。
A、 事件日志类型分类
事件日志的类型用于指示事件日志的严重度。每个事件必须具有单一的类型,应用程序在报告事件时将指示该类型。事件查看器使用该类型来确定在日志的列表视图中显示哪一个图标。它分为如下五类:
①     Error:错误事件,它指示用户应该知道的严重问题(通常是功能或数据的丢失)。
②     FailureAudit:失败审核事件,它指示当审核访问尝试失败(例如打开文件的尝试失败)时发生的安全事件。
③     Information:信息事件,它指示重要、成功的操作。
④     SuccessAudit:成功审核事件,它指示当审核访问尝试成功(例如成功登录)时发生的安全事件。
⑤     Warning:警告事件,它指示并不立即具有重要性的问题,但此问题可能表示将来会导致问题的条件。
在实际应用中,选择合适的事件日志类型,可以使日志记录更清晰明了,帮助开发维护人员对应用系统更好的监控和维护。
B、 针对事件日志的五种类型分类,可以在应用程序中写一个通用的类,为每一个类型写一个方法来写入事件日志。
下面是自定义的通用类的代码片断:
public void Error(string sourceName, string message){
EventLog eventLog = null;
if (!(EventLog.SourceExists(sourceName))){
EventLog.CreateEventSource(sourceName, "TDDN");
}
if (eventLog == null){
eventLog = new EventLog("TDDN");
eventLog.Source = sourceName;
}
eventLog.WriteEntry(message, EventLogEntryType.Error);
}
public void Warning(string sourceName, string message){
EventLog eventLog = null;
if (!(EventLog.SourceExists(sourceName))){
EventLog.CreateEventSource(sourceName, "TDDN");
}
if (eventLog == null){
eventLog = new EventLog("TDDN");
eventLog.Source = sourceName;
}
eventLog.WriteEntry(message,System.Diagnostics.EventLogEntryType.Warning);
}
类似的可以写出其它三种类型的事件日志写入方法。该类方法将事件源(sourceName)和日志消息(message)作为参数传递,这样可以提高事件日志写入的灵活性。
C、 调用通用类事件日志写入的方法
通用类方法的调用非常简单,如下代码片断是调用通用类中Error方法的一个范例:
string strSourceName="WebLog";
CoustomEventLog log=new CoustomEventLog();
log.Error(strSourceName,"This is Error!");
strSourceName是事件源,log是CoustomEventLog类(即通用类)的一个实例,然后调用Error方法将日志消息“This is Error!”写入到事件日志中。
也可以将程序中抛出的异常信息写入事件日志:
string strSourceName="WebLog";
CoustomEventLog log=new CoustomEventLog();
try{
//执行事件

(0)

相关推荐

  • C#控制台程序使用Log4net日志组件详解

    C#控制台程序使用Log4net日志组件,供大家参考,具体内容如下 1.Log4net一般都不陌生,但是在配置上不同类型的项目又不相同的地方比如C#控制台程序和C# MVCWeb项目,拿控制台项目为例 项目源码在文章底部 2.首先创建一个控制台程序,引入Log4net.dll --使用NuGet 3.进行一些简单的配置,在App.config文件中配置,如果大家没有App.config文件,可以通过在解决方案中,添加新建项→应用程序配置文件,进行添加. <?xml version="1.0

  • c#实现把异常写入日志示例(异常日志)

    将异常写到日志文件中,可以在调试程序的时候知道程序发生过哪些异常,并且可以知道异常发生的位置.这点对需要进行长时间运行并调试的程序尤为有效. 复制代码 代码如下: /// <summary>/// 将异常打印到LOG文件/// </summary>/// <param name="ex">异常</param>/// <param name="LogAddress">日志文件地址</param>p

  • C#实现Log4Net日志分类和自动维护实例

    本文实例讲述了C#实现Log4Net日志分类和自动维护的实现方法.分享给大家供大家参考.具体实现方法如下: 一.背景 在程序中,我们调试运行时信息,Log4Net是一个不错的解决方案.不知道是我用的不好,用到最后反而都不想看日志了.原因是因为我n个功能使用的默认的Logger来记录日志,这样以来,所有功能记录的信息都依赖同一个配置,于是所有的信息都在一个文件中,有时候查找起来,极其不方便. 我想,能不能按照功能分类呢?如果通过配置不同的logger,然后功能根据不同的LoggerName加载Il

  • c#.NET中日志信息写入Windows日志中解决方案

    1. 目的   应用系统的开发和维护离不开日志系统,选择一个功能强大的日志系统解决方案是应用系统开发过程中很重要的一部分.在.net环境下的日志系统解决方案有许多种,log4net是其中的佼佼者.  在Windows2000及以上操作系统中,有一个Windows日志系统,它包括应用程序(Application)事件日志.系统(System)日志和安全(Security)日志,事件日志也可以是自定义日志.在.net Framework中也提供了相应的类和接口来使用应用程序事件日志或者自定义事件日志

  • Qt5实现qDebug日志信息写入日志文件过程

    目录 1.思路 2.代码 3.问题 4.结果与扩展思路 1.思路 其实Qt提供了将日志写入文件的方式,是以接口的形式提供的,我们只需要按照我们的需求完成回调函数和我们自己的接口即可. 为方便调用,我们一般直接写到log.h中即可. 1.创建log.h 2.根据我们自己的需求完成回调函数 3.根据需求封装外部调用函数并注册回调函数 2.代码 我这里按照我的需求,当接口传递日志文件名和等级时使用传递的文件存储日志,否则以精确到当前时间为文件名创建日志文件. 提供给外部的调用函数包含日志文件名和日志等

  • MySQL中常见的几种日志汇总

    前言: 在 MySQL 系统中,有着诸多不同类型的日志.各种日志都有着自己的用途,通过分析日志,我们可以优化数据库性能,排除故障,甚至能够还原数据.这些不同类型的日志有助于我们更清晰的了解数据库,在日常学习及运维过程中也会和这些日志打交道.本节内容将带你了解 MySQL 数据库中几种常用日志的作用及管理方法. 1.错误日志(errorlog) 错误日志记录着 mysqld 启动和停止,以及服务器在运行过程中发生的错误及警告相关信息.当数据库意外宕机或发生其他错误时,我们应该去排查错误日志. lo

  • PHP如何将log信息写入服务器中的log文件

    将log信息写入服务器中的log文件文件,折腾了一大圈终于找到了解决方案,具体内容如下: 折腾: [记录]php中如何写类和如何使用类 期间,需要整理出一份,可配置的,通用的,log系统. 支持写入log信息到log文件中. [折腾过程] 1.搜: php log to file 参考: PHP: error_log – Manual PHP: syslog – Manual How to create logs with PHP – Web Services Wiki Write to a l

  • 可替代log4j日志的c#简单日志类队列实现类代码分享

    复制代码 代码如下: using System;using System.Collections.Generic;using System.Globalization;using System.IO;using System.Linq;using System.Text;using System.Threading; namespace LogisTrac{    /// <summary>    /// 日志类     /// 队列 可年/月/周/日/大小分割    /// 调用方法:   

  • 关于Mysql通用查询日志和慢查询日志分析

    MySQL中的日志包括:错误日志.二进制日志.通用查询日志.慢查询日志等等.这里主要介绍下比较常用的两个功能:通用查询日志和慢查询日志. 1.通用查询日志:记录建立的客户端连接和执行的语句. 2.慢查询日志:记录所有执行时间超过longquerytime秒的所有查询或者不使用索引的查询 一.通用查询日志 在学习通用日志查询时,需要知道两个数据库中的常用命令: 1) show variables like '%general%'; 可以查看,当前的通用日志查询是否开启,如果general_log的

  • 在 Windows服务器中启用/禁用SMBv1、SMBv2和SMBv3的方法

    本文介绍如何在 SMB 客户端和服务器组件上启用/禁用服务器消息块 SMBv1.SMBv2 和 SMBv3. 注意:建议由专业技术工程师完成以下操作. 禁用 SMBv2 和 SMBv3 的影响 我们建议不要禁用 SMBv2 或 SMBv3.禁用 SMBv2 或 SMBv3 只能作为临时故障排除措施.请勿使 SMBv2 或 SMBv3 保持禁用状态. 禁用 SMBv2 的影响 在 Windows 7 和 Windows Server 2008 R2 中,禁用 SMBv2 会停用以下功能: 请求复合

  • JavaScript如何获取到导航条中HTTP信息

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 1.style中带有注释的部分为获取HTTP中的信息 2.body中显示效果为: 1).打开页面是自动弹出输入提示框 2).点击删除时,会有警告框弹出 点击确定时,删除信息    点击取消时,不删除信息 代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8">

  • python3-flask-3将信息写入日志的实操方法

    使用logging模块,记录日志信息 安装模块 pip3 install logging 脚本示例 vim flask_api_logging.py #!/usr/bin/env python3 # -*- coding:utf-8 -*- import json import logging from flask import Flask, request, jsonify app = Flask(__name__) @app.route("/flask_api/", methods

  • 使用Python将Exception异常错误堆栈信息写入日志文件

    假设需要把发生异常错误的信息写入到log.txt日志文件中去: import traceback import logging logging.basicConfig(filename='log.txt', level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') try: raise Exception('发生异常错误信息') except: #方案一,自己定义一个文件,自己把错误堆栈信息写入文件. #er

随机推荐