Created
September 5, 2017 08:55
-
-
Save Soar360/18161df9788d77271a5ef262f447754c to your computer and use it in GitHub Desktop.
解析Nginx日志
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class NginxLogParser | |
{ | |
/// <summary> | |
/// 解析Nginx日志 | |
/// </summary> | |
/// <param name="log"></param> | |
/// <returns></returns> | |
/// <remarks> | |
/// \x0A*,\x08\xD4\x98\x82*\xFF | |
/// 拆分为: | |
/// 0x0A | |
/// * | |
/// , | |
/// 0x08 | |
/// 0xD4 | |
/// 0x98 | |
/// 0x82 | |
/// * | |
/// 0xFF | |
/// </remarks> | |
public byte[] Parse(string log) | |
{ | |
using (var ms = new MemoryStream()) | |
{ | |
var state = 0; | |
/* | |
* 0:开始 | |
* 1:转义符 | |
* 2:x | |
* 3:第一个数据位 | |
* 4:第二个数据位 | |
*/ | |
var buffer = new char[2]; | |
foreach (var code in log) | |
{ | |
switch (state) | |
{ | |
case 0: | |
{ | |
if (code == '\\') | |
{ | |
state = 1; | |
} | |
else | |
{ | |
ms.WriteByte((byte) code); | |
} | |
} | |
break; | |
case 1: | |
{ | |
if (code == 'x') | |
{ | |
state = 2; | |
} | |
else | |
{ | |
throw new Exception("格式不正确"); | |
} | |
} | |
break; | |
case 2: | |
{ | |
buffer[0] = code; | |
state = 3; | |
} | |
break; | |
case 3: | |
{ | |
buffer[1] = code; | |
ms.WriteByte(Convert.ToByte(new string(buffer), 16)); | |
state = 0; //归零状态机 | |
} | |
break; | |
} | |
} | |
return ms.ToArray(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment