您的位置:首页 > 理论基础

C# 向计算机系统写入windows日志(系统日志)。

2012-09-18 12:06 363 查看
如图:



代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Security;

namespace EGetIp.Util
{
public class SysLog
{
/// <summary>
/// 系统日志所在的主机名。当前设定:本地电脑
/// </summary>
public const string MACHINE_NAME = ".";
/// <summary>
/// 系统日志名。当前设定:应用程序
/// </summary>
public const string LOG_NAME = "Application";
/// <summary>
/// 消息事件类型。当前设定:无;该值为0的时候分类为“无”。
/// </summary>
public const short CATEGORY = 0;
/// <summary>
/// 消息事件的种类:信息(Information),警告(Warning),重大错误(Error)
/// </summary>
public enum LogType
{
Error = 1,
Warning = 2,
Information = 4
}
static SysLog()
{ }

/// <summary>
/// 向日志管理器写入系统日志
/// </summary>
/// <param name="source">消息事件来源</param>
/// <param name="message">要在消息事件中写入的信息</param>
/// <param name="type">消息事件类型</param>
/// <param name="eventID">消息事件的事件ID。(0~65535)</param>
/// <exception cref="System.ComponentModel.Win32Exception">系统日志存储空间不足时</exception>
/// <exception cref="System.Security.SecurityException">操作系统日志权限不足时</exception>
static public void WriteEntry(string source, string message, LogType type, int eventID)
{
try
{
if (!EventLog.SourceExists(source))
{
EventLog.CreateEventSource(source, LOG_NAME);
}
EventLog.WriteEntry(source, message, GetLogEntryType(type), eventID, CATEGORY);
}
catch (SecurityException)
{
//碰到权限不够无法操作系统日志的情况时,模拟本地管理员权限进行操作。
//提示:当注册表中没有消息事件来源时,会发生该例外
//ImpersonateAccount类的代码参考鄙人另一篇文章C#模拟AD用户
//不要指望可以使用System.Diagnostics.EventLogInstaller类,使用它也需要本地系统管理员的权限
//using (ImpersonateAccount sa = new ImpersonateAccount("<用户名>", "<域>", "<密码>"))
//{
//    if (!EventLog.SourceExists(source))
//    {
//        EventLog.CreateEventSource(source, LOG_NAME);
//    }
//    EventLog.WriteEntry(source, message, GetLogEntryType(type), eventID, CATEGORY);
//}
}
}
/// <summary>
/// 向日志管理器写入系统日志
/// </summary>
/// <param name="source">消息事件来源</param>
/// <param name="ex">要在消息事件中写入的信息</param>
/// <param name="eventID">消息事件的事件ID。(0~65535)</param>
static public void WriteEntry(string source, Exception ex, int eventID)
{
StringBuilder sb = new StringBuilder();
if (ex != null)
{
sb.AppendFormat("[Message]{0}\r\n", ex.Message);
sb.AppendFormat("[Source]{0}\r\n", ex.Source);
sb.AppendFormat("[TargetSite]{0}\r\n", ex.TargetSite);
sb.AppendFormat("[ToString]{0}\r\n", ex.ToString());
if (ex.Data.Count > 0)
{
sb.Append("[Data]");
foreach (System.Collections.DictionaryEntry var in ex.Data)
{ sb.AppendFormat("\t[{0}]:{1}\n", var.Key, var.Value); }
}
}
WriteEntry(source, sb.ToString(), LogType.Error, eventID);
}
/// <summary>
/// 将LogType类型转换成EventLogEntryType类型
/// </summary>
/// <param name="type">LogType</param>
/// <returns>EventLogEntryType</returns>
static private EventLogEntryType GetLogEntryType(LogType type)
{
Type t = typeof(EventLogEntryType);
if (Enum.IsDefined(t, (int)type))
{ return (EventLogEntryType)Enum.Parse(t, ((int)type).ToString()); }
else
{
StringBuilder sb = new StringBuilder();
sb.Append("LogType类型无法转换为EventLogEntryType类型");
sb.AppendFormat("(LogType:{0})", type);
throw new ApplicationException(sb.ToString());
}
}
}
}


参考:http://www.wxzzz.com/?id=120
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: