<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->
<!-- Set root logger level to ERROR and its appenders -->
<root>
<level value="INFO" />
<appender-ref ref="Info2" />
</root>
<!-- Print only messages of level DEBUG or above in the packages -->
<logger name="loginfo">
<!--Fatal ERROR WARN DEBUG INFO ALL-->
<level value="INFO" />
<appender-ref ref="Info"/>
</logger>
<logger name="errorinfo">
<!--Fatal ERROR WARN DEBUG INFO ALL-->
<level value="INFO" />
<appender-ref ref="Error"/>
</logger>
<appender name="Info" type="log4net.Appender.RollingFileAppender,log4net">
<param name="File" value="InfoLogs\\" />
<param name="AppendToFile" value="true" />
<param name="MaxSizeRollBackups" value="100" />
<param name="MaxFileSize" value="2097152" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value="yyyyMMdd".txt"" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
</layout>
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
</appender>
<appender name="Error" type="log4net.Appender.RollingFileAppender,log4net">
<param name="File" value="ErrorLogs\\" />
<param name="AppendToFile" value="true" />
<param name="MaxSizeRollBackups" value="100" />
<param name="MaxFileSize" value="2097152" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value="yyyyMMdd".txt"" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
</layout>
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
</appender>
</log4net>
</configuration>
public class LogHelper
{
public static readonly ILog loginfo = LogManager.GetLogger("loginfo");
public static readonly ILog errorinfo = LogManager.GetLogger("errorinfo");
public static void WriteLog(string info)
{
if (loginfo.IsInfoEnabled)
{
loginfo.Info(info);
}
}
public static void WriteErrorLog(string info)
{
if (errorinfo.IsErrorEnabled)
{
errorinfo.Error(info);
}
}
private static string ReadTxt(string logFile)
{
if (!File.Exists(logFile) && DateTime.Now.Hour > 10)
{
string f = DateTime.Now.AddDays(-1).ToString("yyyyMMdd") + ".txt";
logFile = Path.Combine(Environment.CurrentDirectory, "logs", f);
}
if (File.Exists(logFile))
{
return ReadFileInReverse(logFile, 10);
}
return "";
}
public static string ReadErrorLog()
{
string f = DateTime.Now.ToString("yyyyMMdd") + ".txt";
string logFile = Path.Combine(Environment.CurrentDirectory, "ErrorLogs", f);
return ReadTxt(logFile);
}
public static string ReadLog()
{
string f = DateTime.Now.ToString("yyyyMMdd") + ".txt";
string dir = Path.Combine(Environment.CurrentDirectory, "InfoLogs");
string logFile = Path.Combine(dir, f);
IList<string> lst = new List<string>();
for (int i = 0; i <= 7; i++)
{
f = DateTime.Now.AddDays(-i).ToString("yyyyMMdd") + ".txt";
lst.Add(Path.Combine(dir, f).ToUpper());
}
foreach (string item in Directory.GetFiles(dir))
{
if (lst.Contains(item.ToUpper()))
continue;
File.Delete(item);
}
return ReadTxt(logFile);
}
private static string ReadFileInReverse(string logFile, int lines)
{
int n = 0;
int i = 1;//指的是不停的向后(文件末尾向前移动)按字节往前读的位置
int b = 1;
using (FileStream fs = new FileStream(logFile, FileMode.Open, FileAccess.Read, FileShare.Write))
{
if (fs.Length == 0) return string.Empty;
MemoryStream ms = new MemoryStream();
while (b > 0)
{
long t = fs.Seek(-i, SeekOrigin.End);
i++;
if (t == 0) break;//t代表当前正序时的位置最前面是1,如果不判断,当文档没有N行时,会造成移动到-1位置报错,意思就是到了文件头了不能再前移了,防止傻比行为
b = fs.ReadByte();
ms.WriteByte((byte)b);
char ch = Convert.ToChar(b);
if (ch == '\n')//按行取,指的是\r\n的行,这里只判断\n
n++;
if (n >= lines) break;//这里就是取多少行
}
byte[] data = ms.ToArray();
Array.Reverse(data);
ms.Close();
string txt = Encoding.GetEncoding("GB2312").GetString(data);
return txt.Trim();
}
}
}