1、定义输出目标类型
public enum LogTarget
{
File,
Console
}
2、定义日志基类
public abstract class LogBase
{
public static string logPath;
protected readonly object lockObject = new object();
public abstract void Log(string message);
}
3、输出日志文件
public class FileLogger : LogBase
{
static string fileName;
//private string filePath = Path.Combine(logPath, "log" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt");
static FileLogger()
{
if (logPath==null || logPath.Equals(""))
{
logPath = AppDomain.CurrentDomain.BaseDirectory;
logPath = Path.Combine(logPath, "log");
if (!Directory.Exists(logPath))
{
Directory.CreateDirectory(logPath);
}
}
fileName = DateTime.Now.ToString("yyyyMMdd") + ".log";
fileName = Path.Combine(logPath, fileName);
}
public override void Log(string message)
{
message=message+Environment.NewLine;
using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 128, FileOptions.Asynchronous))
{
lock (lockObject)
{
byte[] buffer = Encoding.Default.GetBytes(message);
long position = fs.Length;
if (position > 33_554_432L)
{
HandleLogFile(fs, ref position);
}
fs.Seek(position, SeekOrigin.Begin);
fs.Write(buffer, 0, buffer.Length);
fs.Close();
}
}
}
/// <summary>
/// 日志文件超过32M则从临时文件拷贝出去
/// </summary>
/// <param name="fs"></param>
/// <param name="position"></param>
private static void HandleLogFile(FileStream fs, ref long position)
{
string target = Path.Combine(logPath, DateTime.Now.ToString("yyyy-MM-dd HH:mm:dd:fff") + ".log");
if (!File.Exists(target))
{
File.Copy(fileName, target);
fs.Seek(0, SeekOrigin.Begin);
fs.SetLength(0);
position = 0;
}
}
}
4、输出到控制台
public class ConsoleLogger : LogBase
{
public override void Log(string message)
{
lock (lockObject)
{
Console.WriteLine(message);
}
}
}
5、日志管理
public static void Information(LogTarget target, string outTemplate)
{
//string outTemplate = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} [Info] {message}";
switch (target)
{
case LogTarget.File:
logBase = new FileLogger();
logBase.Log(outTemplate);
break;
case LogTarget.Console:
logBase = new ConsoleLogger();
logBase.Log(outTemplate);
break;
default:
break;
}
}
6、日志应用函数
private static LogBase logBase = null;
public static void SetLogPath([CallerMemberName]string path="")
{
LogBase.logPath = path;
}
public static void Info(string message)
{
string outTemplate = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} [Info] {message}";
Information(LogTarget.File, outTemplate);
}
public static void Debug(string message)
{
string outTemplate = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} [Debug] {message}";
Information(LogTarget.File, outTemplate);
}
public static void Warn(string message)
{
string outTemplate = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} Warn] {message}";
Information(LogTarget.File, outTemplate);
}
public static void Error(string message)
{
string outTemplate = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} Error] {message}";
Information(LogTarget.File, outTemplate);
}
7、日志使用
Logger.Info($"{name}(Pxie4135) is Compliance");