首页 > 编程语言 >C# 日志

C# 日志

时间:2024-07-30 17:18:05浏览次数:8  
标签:info string C# static msg 日志 isWrite

本篇接扫 log4net 基本使用

一、导包

 

二、配置文件

Log4Net.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
        <section name="log4net"
          type="log4net.Config.Log4NetConfigurationSectionHandler,&#xD;&#xA;log4net-net-1.0"/>
    </configSections>
    <log4net>
        <appender name="AppLog" type="log4net.Appender.RollingFileAppender">
            <param name="File" value="SysLog/" />
            <param name="AppendToFile" value="true" />
            <param name="MaxSizeRollBackups" value="-1" />
            <!--最小锁定模型以允许多个进程可以写入同一个文件-->
            <param name="lockingModel"  type="log4net.Appender.FileAppender+MinimalLock" />
            <param name="MaximumFileSize" value="10MB" />
            <param name="RollingStyle" value="Size" />
            <param name="DatePattern" value="yyyy-MM-dd" />
            <param name="StaticLogFileName" value="true" />
            <layout type="log4net.Layout.PatternLayout">
                <param name="ConversionPattern" value="%-5p %d [%c] %m%n" />
            </layout>
        </appender>
        <logger name="AppLog">
            <level value="all" />
            <appender-ref ref="AppLog" />
        </logger>
        <root>
            <level value="all" />
        </root>
    </log4net>
</configuration>

 

AppLog.cs
using log4net;
using log4net.Appender;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Log4net
{
    public class AppLog
    {
        private static string filepath = AppDomain.CurrentDomain.BaseDirectory + @"\SysLog\";

        private static readonly log4net.ILog logComm = log4net.LogManager.GetLogger("AppLog");

        static AppLog()
        {
            log4net.Config.XmlConfigurator.Configure(new FileInfo("log4net.config"));

            if (!Directory.Exists(filepath))
            {
                Directory.CreateDirectory(filepath);
            }
        }
        public static readonly object o = new object();
        /// <summary>
        /// 写入日志
        /// </summary>
        /// <param name="msg">日志内容</param>
        /// <param name="isWrite">是否写</param>
        /// <param name="action">写日志的方法</param>
        /// <param name="info">日志文件名,便于分开日志文件</param>
        private static void WriteLog(string msg, bool isWrite, Action<object> action, string info = "")
        {
            if (isWrite)
            {
                lock (o)
                {
                    string filename = $"AppLog_{action.Method.Name}_{info}_{ DateTime.Now.ToString("yyyyMMdd_HH")}.log";
                    var repository = LogManager.GetRepository();

                    #region MyRegion
                    var appenders = repository.GetAppenders();
                    if (appenders.Length > 0)
                    {
                        RollingFileAppender targetApder = null;
                        foreach (var Apder in appenders)
                        {
                            if (Apder.Name == "AppLog")
                            {
                                targetApder = Apder as RollingFileAppender;
                                break;
                            }
                        }
                        if (targetApder.Name == "AppLog")//如果是文件输出类型日志,则更改输出路径
                        {
                            if (targetApder != null)
                            {
                                if (!targetApder.File.Contains(filename))
                                {
                                    targetApder.File = @"SysLog\" + filename;
                                    targetApder.ActivateOptions();
                                }
                            }
                        }
                    }
                    #endregion
                    action(msg);
                    //logComm.Error(msg + "\n");
                }
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="msg">日志内容</param>
        /// <param name="info">日志文件名,便于分开日志文件</param>
        /// <param name="isWrite">是否写入</param>
        public static void WriteError(string msg, string info = "", bool isWrite = true)
        {
            WriteLog(msg, isWrite, logComm.Error, info);
        }
        public static void WriteInfo(string msg, string info = "", bool isWrite = true)
        {
            WriteLog(msg, isWrite, logComm.Info, info);
        }
        public static void WriteWarn(string msg, string info = "", bool isWrite = true)
        {
            WriteLog(msg, isWrite, logComm.Warn, info);
        }
        public static void WriteFatal(string msg, string info = "", bool isWrite = true)
        {
            WriteLog(msg, isWrite, logComm.Fatal, info);
        }
    }
}

 

三、使用

 AppLog.WriteError("用户[张三]:点击了执行了步骤1,发送错误");

 

标签:info,string,C#,static,msg,日志,isWrite
From: https://www.cnblogs.com/zeussbook/p/18332959

相关文章

  • 臂式血压计电子方案ocba设计与开发
    臂式血压计是运用电子技术与血压间接测量原理进行血压测量的医疗设备。臂式血压计有臂式、腕式、手表式之分;其电子技术已经历了最原始的第一代(机械式定速排气阀)、第二代(电子伺服阀)、第三代(加压同步测量)及第四代(集成气路)的发展。通常由阻塞袖带、传感器(气压计)、电磁阀、充气泵......
  • Codeforces Round 929 (Div. 3)---->E. Turtle vs. Rabbit Race: Optimal Trainings
    https://codeforces.com/contest/1933/problem/E#include<bits/stdc++.h>#definexfirst#defineysecondusingnamespacestd;typedeflonglongll;typedef__int128i128;typedefpair<int,int>pii;constintN=2e5+10,M=110;intn,q;inta[N];ll......
  • Apache DolphinScheduler用户线上Meetup火热来袭!
    ApacheDolphinScheduler社区8月用户交流会精彩继续!本次活动邀请到老牌农牧产品实业集团铁骑力士架构工程师,来分享ApacheDolphinScheduler在现代农牧食品加工场景中的应用实践。此外,还将有社区活跃贡献者以ApacheDolphinScheduler为例,总结ApacheDolphinScheduler以及Apache......
  • chapter3------保护模式之特权级转移
    特权级特权级总共有4个级别,数字越小表示的特权级越大CPL-CurrentPrivilegeLevel(当前特权级):用于指示处理器当前运行的特权级别DPL-DescriptorPrivilegeLevel(描述符特权级):用于指示段描述符或门描述符的特权级别。每个段描述符或门描述符都有一个DPL字段,它决定了访问该......
  • C++11 中引入的auto关键字
    什么是auto关键字?    在C++11中,auto关键字被引入作为一种类型推断的机制(在编译期间执行),它允许编译器自动推断变量的类型。auto使用时需要注意的问题:1、auto与指针和引用结合使用:首先说一下auto和auto*为什么一样,因为在autoa=&x;这里auto类型推......
  • 《饿殍:明末千里行》PC+手机版分享,高达97%的好评率。
    《饿殍:明末千里行》是由零创游戏开发的一款文字冒险游戏,获得了高达97%的好评率,游戏以明末旅行为主题,玩家将扮演一名名为“良”的盗匪,任务是将四名女孩从华州城运送至洛阳城。在这个过程中,玩家将逐渐揭开真相并面临重要的选择。游戏的背景设定在明末崇祯年间,这个时期正值国家内......
  • ThreadLocal和内存泄漏原理
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、ThreadLocal原理二、ThreadLocal内存泄漏三、为什么使用弱引用?总结前言复杂事简单说:ThreadLocal一、ThreadLocal原理每一个线程绑定一个ThreadLocalMap,里面存放该线程自己的数据,......
  • Java使用EasyExcel自定义合并(横纵合并)、自定义行高列宽、自适应行高列宽工具Excel导出
    目录一、自适应行高列宽工具类1、自适应行高2、自适应列宽二、自定义行高列宽工具类1、自定义行高2、自定义列宽三、自定义合并工具类四、自定义样式五、实现Excel的完整代码最近又开始写Excel导出的业务,之前写的自适应行高列宽工具类并不满足现下的需求需求是导出......
  • linux+jenkins+github+.net core CI/CD 快速部署
    目标:代码提交后,在jenkins点击build,编译通过后能让linux更新.netcore文件和重新运行 步骤:1.腾讯云搞一台免费linux服务器:https://cloud.tencent.com/2.服务上安装jenkinshttps://www.jenkins.io/doc/book/installing/linux/#red-hat-centos3.腾讯云防火墙开放8080端口,另一......
  • 【YashanDB知识库】使用select * 创建的物化视图无法进行查询重写
    问题现象使用如下语句准备测试数据:altersystemsetquery_rewrite_enabled=forcescope=both;droptabletest;createtabletest(tidnumber,tnamevarchar2(30));beginforiin1..100000loopinsertintotestvalues(i,i||'abcd');endloop;end;/commit......