NLog 自定义字段 写入 oracle

NLog日志配置与使用
本文介绍如何使用NLog进行日志记录配置,并提供了一个实际的代码示例,包括安装NLog、创建日志表、配置NLog.config文件及简单的封装类。还展示了ASP.NET中的调用示例。

1、通过Nuget安装NLog 下载,简单入门 请参照 我刚才转的几篇文章,下面我直接贴代码

2、建表语句

create table TBL_LOG
(
  id            VARCHAR2(60)  not null,
  appname       VARCHAR2(20),
  modulename    VARCHAR2(30),
  procname      VARCHAR2(30),
  operationtype VARCHAR2(20),
  logger        VARCHAR2(500),
  logmessage    VARCHAR2(3000) not null,
  ip            VARCHAR2(32),
  longdate      VARCHAR2(36),
  username      VARCHAR2(36),
  createdate    DATE default sysdate,
  loglevel      VARCHAR2(12)
)

3、NLog.config,正式运行 throwExceptions="false"

 

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="true"
      internalLogLevel="Info" internalLogFile="d:\work\log1.txt">
  <targets async="true">
    <target name="database" xsi:type="Database" keepConnection="false" useTransactions="true"
                dbProvider="System.Data.OracleClient.OracleConnection,System.Data.OracleClient, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
                connectionString="Data Source=ORCL;User Id=oracle;Password=oracle;Integrated Security=no;"
                commandText="insert into TBL_LOG(APPNAME,MODULENAME,PROCNAME,OPERATIONTYPE,LOGGER,LOGMESSAGE,IP,LONGDATE,USERNAME,LOGLEVEL) values(:APPNAME,:MODULENAME,:PROCNAME,:OPERATIONTYPE,:LOGGER,:LOGMESSAGE,:IP,:TIME_STAMP,:USERNAME,:LOGLEVEL)">
      <parameter name="APPNAME" layout="${event-context:item=APPNAME}" />
      <parameter name="MODULENAME" layout="${event-context:item=MODULENAME}" />
      <parameter name="PROCNAME" layout="${event-context:item=PROCNAME}" />
      <parameter name="OPERATIONTYPE" layout="${event-context:item=OPERATIONTYPE}" />
      <parameter name="LOGGER" layout="${event-context:item=LOGGER}" />
      <parameter name="LOGMESSAGE" layout="${event-context:item=LOGMESSAGE}" />
      <parameter name="IP" layout="${event-context:item=IP}" />
      <parameter name="TIME_STAMP" layout="${longdate}" />
      <parameter name="USERNAME" layout="${event-context:item=USERNAME}" />
      <parameter name="LOGLEVEL" layout="${level:uppercase=true}" />
    </target>
  </targets>
  <rules>
    <logger name="*" minlevel="Trace"  writeTo="database" />
  </rules>
</nlog>

 

 

 

 

4、简单封装

public class Logger
    {
        #region 初始化
        /// <summary>
        /// 数据错误无法获取用户时使用
        /// </summary>
        public static string DefaultUser = "system";
        /// <summary>
        /// 默认地址
        /// </summary>
        public static string DefaultIP = "127.0.0.1";
        NLog.Logger _logger;
        private Logger(NLog.Logger logger)
        {
            _logger = logger;
        }
        public Logger(string name) : this(LogManager.GetLogger(name))
        { }
        public static Logger Default { get; private set; }
        static Logger()
        {
            Default = new Logger(LogManager.GetCurrentClassLogger());
        }
        #endregion
        #region Process日志写入
        /// <summary>
        /// 日志写入
        /// </summary>
        /// <param name="APPNAME">菜单大类</param>
        /// <param name="MODULENAME">二级菜单</param>
        /// <param name="PROCNAME">本级菜单</param>
        /// <param name="OPERATIONTYPE">操作类型</param>
        /// <param name="LOGMESSAGE">详细日志</param>
        /// <param name="IP">ip地址</param>
        /// <param name="USERNAME">用户名</param>
        /// <param name="LOGGER">LOGGER</param>
        public void Process(string APPNAME, string MODULENAME, string PROCNAME, OperationType OPERATIONTYPE, string LOGMESSAGE, string IP, string USERNAME, string LOGGER)
        {
            if (LOGMESSAGE.Length > 3000)
            {
                LOGMESSAGE = LOGMESSAGE.Substring(0, 3000);
            }
            LogEventInfo lei = new LogEventInfo();
            lei.Properties["ID"] = Guid.NewGuid().ToString("D");
            lei.Properties["APPNAME"] = APPNAME;
            lei.Properties["MODULENAME"] = MODULENAME;
            lei.Properties["PROCNAME"] = PROCNAME;
            lei.Properties["OPERATIONTYPE"] = OPERATIONTYPE;
            lei.Properties["LOGMESSAGE"] = LOGMESSAGE;
            lei.Properties["IP"] = IP;
            lei.Properties["USERNAME"] = USERNAME;
            lei.Properties["LOGGER"] = LOGGER;
            lei.Level = LogLevel.Info;
            _logger.Log(lei);
        }
        /// <summary>
        /// 日志写入,自己传日志类别
        /// </summary>
        /// <param name="APPNAME">菜单大类</param>
        /// <param name="MODULENAME">二级菜单</param>
        /// <param name="PROCNAME">本级菜单)</param>
        /// <param name="OPERATIONTYPE">操作类型</param>
        /// <param name="LOGMESSAGE">详细日志</param>
        /// <param name="IP">ip地址</param>
        /// <param name="USERNAME">用户名</param>
        /// <param name="LOGGER">LOGGER</param>
        /// <param name="Level">日志级别</param>
        public void Process(string APPNAME, string MODULENAME, string PROCNAME, OperationType OPERATIONTYPE, string LOGMESSAGE, string IP, string USERNAME, string LOGGER, LogLevel Level)
        {
            if (LOGMESSAGE.Length > 3000)
            {
                LOGMESSAGE = LOGMESSAGE.Substring(0, 3000);
            }
            LogEventInfo lei = new LogEventInfo();
            lei.Properties["ID"] = Guid.NewGuid().ToString("D");
            lei.Properties["APPNAME"] = APPNAME;
            lei.Properties["MODULENAME"] = MODULENAME;
            lei.Properties["PROCNAME"] = PROCNAME;
            lei.Properties["OPERATIONTYPE"] = OPERATIONTYPE;
            lei.Properties["LOGMESSAGE"] = LOGMESSAGE;
            lei.Properties["IP"] = IP;
            lei.Properties["USERNAME"] = USERNAME;
            lei.Properties["LOGGER"] = LOGGER;
            lei.Level = Level;
            _logger.Log(lei);
        }
        #endregion      
    }
    /// <summary>
    /// 操作类型枚举
    /// </summary>
    public enum OperationType
    {
        /// <summary>
        /// 保存或添加
        /// </summary>
        [System.ComponentModel.Description("保存或添加")]
        ADD,
        /// <summary>
        /// 更新
        /// </summary>
        [System.ComponentModel.Description("更新")]
        UPDATE,
        /// <summary>
        /// 审核
        /// </summary>
        [System.ComponentModel.Description("审核")]
        AUDIT,
        /// <summary>
        /// 删除
        /// </summary>
        [System.ComponentModel.Description("删除")]
        DELETE,
        /// <summary>
        /// 读取/查询
        /// </summary>
        [System.ComponentModel.Description("读取/查询")]
        RETRIEVE,
        /// <summary>
        /// 登录
        /// </summary>
        [System.ComponentModel.Description("登录")]
        LOGIN,
        /// <summary>
        /// 查看
        /// </summary>
        [System.ComponentModel.Description("查看")]
        LOOK
    }

5、asp.net中的调用列子:

1             Logger.Default.Process("系统管理", "权限管理", "用户管理", OperationType.RETRIEVE, "测试写入", Logger.DefaultIP, Logger.DefaultUser, this.GetType().ToString(), NLog.LogLevel.Error);
2             Logger.Default.Process("系统管理", "权限管理", "用户管理", OperationType.RETRIEVE, "测试写入", Logger.DefaultIP, Logger.DefaultUser, this.GetType().ToString());

 

NLog中,如果你想要将自定义字段的值输出到SQL Server,你需要配置一个适配器来处理NLog的日志记录,并将其插入到SQL数据库。以下是基本步骤: 1. **安装NLog targets for SQL Server**:首先,确保已安装NLog的SQL Server target,可以通过NuGet包管理器添加"NLog.Extensions.Logging.SqlServer"。 2. **创建自定义字段**:在你的日志布局(layout)中,使用 `${event-properties:item=YourCustomField}` 来引用你的自定义字段。比如假设你有一个名为 "MyCustomField" 的字段,可以写作 `${event-properties:item=MyCustomField}`。 3. **配置连接字符串和表结构**:在NLog.config文件中,设置`<targets><target xsi:type="SqlTarget" ...>`部分,包括SQL Server的连接字符串和表的定义。例如: ```xml <target name="sql-server" xsi:type="SqlTarget" connection-string="Data Source=(local);Initial Catalog=NLogDB;Integrated Security=True;" command-text="INSERT INTO LogTable (Timestamp, Level, Message, YourCustomField) VALUES (@ts, @level, @message, @customfield)" command-type="Text"> <parameter name="@ts" layout="${date:format=yyyy-MM-dd HH:mm:ss}"/> <parameter name="@level" layout="${level}"/> <parameter name="@message" layout="${message}"/> <parameter name="@customfield" layout="${event-properties:item=MyCustomField}" /> </target> ``` 4. **启用日志记录**:配置logger来使用刚刚定义的SQL Server目标: ```xml <logger name="*" minlevel="Debug" writeTo="sql-server" /> ``` 这表示所有级别的调试及以上日志都会被发送到SQL Server。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值