【问题标题】:How to convert escape codes to html or remove如何将转义码转换为 html 或删除
【发布时间】:2021-07-01 15:43:06
【问题描述】:

Debian 中 ASP.NET 5 Core MVC 应用程序中的 Kestrel 将转义码写入 /var/log/syslog 文本文件,如

Apr  5 22:02:21 ew kestrel-store[31907]: #033[40m#033[32minfo#033[39m#033[22m#033[49m: Microsoft.Hosting.Lifetime[0]
Apr  5 22:02:21 ew kestrel-store[31907]:       Now listening on: http://localhost:5000
Apr  5 22:02:21 ew kestrel-store[31907]: #033[40m#033[32minfo#033[39m#033[22m#033[49m: Microsoft.Hosting.Lifetime[0]
Apr  5 22:02:21 ew kestrel-store[31907]:       Application started. Press Ctrl+C to shut down.
Apr  5 22:02:21 ew kestrel-store[31907]: #033[40m#033[32minfo#033[39m#033[22m#033[49m: Microsoft.Hosting.Lifetime[0]
Apr  5 22:02:21 ew kestrel-store[31907]:       Hosting environment: Production
Apr  5 22:02:21 ew kestrel-store[31907]: #033[40m#033[32minfo#033[39m#033[22m#033[49m: Microsoft.Hosting.Lifetime[0]
Apr  5 22:02:21 ew kestrel-store[31907]:       Content root path: /var/www/store5

这个文件被 MVC 控制器读取并发送给视图中的用户。

如何将此文件转换为 html(例如,使用彩色或斜体线)或从文件中删除转义码以使文件更易于阅读? 或者如何强制红隼输出没有转义码的纯文本?

控制器代码:

public IActionResult Syslog()
{
    return new ContentResult()
    {
        Content = FileToStr("/var/log/syslog")
    };
}

static string FileToStr(string cFileName)
{
    StreamReader oReader = File.OpenText(cFileName);
    string lcString = oReader.ReadToEnd();
    oReader.Close();
    return lcString;
}

转义序列定义为:

  1. 一个\x1b
  2. 一个[
  3. 零个或多个参数字节 0x30-0x3f
  4. 零个或多个中间字节 0x20-0x2f
  5. 最后一个字节 0x40-0x7f

更新

答案中的代码将跨度添加到每行的开头,并且不删除转义序列:

<span style="color: blue">Apr  8 00:00:05 ew rsyslogd:  [origin software="rsyslogd" swVersion="8.1901.0" x-pid="573" x-info="https://www.rsyslog.com"] rsyslogd was HUPed</span>
<span style="color: blue">Apr  8 00:00:05 ew systemd[1]: logrotate.service: Succeeded.</span>
<span style="color: blue">Apr  8 00:00:05 ew systemd[1]: Started Rotate log files.</span>
<span style="color: blue">Apr  8 00:00:10 ew colord[1172]: failed to get session [pid 23699]: No data available</span>
<span style="color: blue">Apr  8 00:00:12 ew colord[1172]: failed to get session [pid 23699]: No data available</span>
<span style="color: blue">Apr  8 00:00:14 ew colord[1172]: failed to get session [pid 23699]: No data available</span>
<span style="color: blue">Apr  8 00:05:01 ew CRON[23838]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)</span>
<span style="color: blue">Apr  8 00:15:01 ew CRON[24082]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)</span>
<span style="color: blue">Apr  8 00:17:01 ew CRON[24128]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)</span>
<span style="color: blue">Apr  8 00:21:49 ew kestrel-store[22413]: #033[40m#033[32minfo#033[39m#033[22m#033[49m: WebOptimizer.AssetMiddleware[1000]</span>
<span style="color: blue">Apr  8 00:21:49 ew kestrel-store[22413]:       Request started for '/c/version.js'</span>
<span style="color: blue">Apr  8 00:21:49 ew kestrel-store[22413]: #033[41m#033[30mfail#033[39m#033[22m#033[49m: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1]</span>
<span style="color: blue">Apr  8 00:21:49 ew kestrel-store[22413]:       An unhandled exception has occurred while executing the request.</span>

预期输出是:

【问题讨论】:

  • 请给出一个想法,输出应该是什么样子。
  • 也许 &lt;span style='color:green'&gt;green line&lt;/span&gt; 用于绿线,而 `color:red´ 用于红线。或者转义序列应该简单地从输出文本中删除
  • 当然可以,但是哪条线应该是绿色和蓝色,为什么?我认为问题不在于如何格式化线条,而是找出应该格式化的线条和部分线条。例如。带有正则表达式:带有.*: #033 的行应该是绿色的,所以用&lt;span style='color:green'&gt;$&amp;&lt;/span&gt; 代替它们......但我认为这不是你要找的
  • 匹配颜色在stackoverflow.com/questions/4842424/… 中描述。是的,这就是我正在寻找的。查找以转义字符开头的序列并将其丢弃或将行转换为 html 将彩色部分包装为 span 元素。看起来序列是可变长度的。交替寻找禁用转义序列输出到系统日志
  • 也许你可以使用一个小的 perl 脚本。打开文件和一个新文件,将 html 头文件放入新文件中,逐行读取你的文本文件并将它们设置在一个&lt;span style="..."&gt;...&lt;/span&gt; 最后写html页脚。我认为很容易。

标签: regex asp.net-core asp.net-core-mvc syslog kestrel-http-server


【解决方案1】:

希望这会有所帮助。我用rextester.com写了一个格式化代码。但是文件测试在那里不起作用。

如有必要,请更正此帖子。它也不是最短的版本,但我认为它最清晰。

//Rextester.Program.Main is the entry point for your code. Don't change it.
//Microsoft (R) Visual C# Compiler version 2.9.0.63208 (958f2354)

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;

namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
            using (var reader = new StreamReader(@"c:\your_input_file.txt"))
            using (var writer = new StreamWriter(@"c:\your_output_file.html"))
            {
                WriteHtmlHeader(writer);
                string line;
                while((line = reader.ReadLine()) != null)
                {
                    line = AddSpan(line);
                }
                WriteHtmlFooter(writer);
            }
        }
        
        private static void WriteHtmlHeader(StreamWriter outfile)
        {
            // writing all the header and the start of body...
            // you can take it from another file
        }
        
        private static void WriteHtmlFooter(StreamWriter outfile)
        {
            // writing the footer of your html file
        }
        
        private static string AddSpan(string line)
        {
            if (Regex.IsMatch(line, "\x1b"))
            {
                return AddStyledSpan(line, "color: green");
            }
            else if (Regex.IsMatch(line, "\["))
            {
                return AddStyledSpan(line, "color: blue");
            }
            // ...
            else
            {
                // Mark this span as error or standard
                return AddStyledSpan(line, "color: red");
            }
        }
            
        private static string AddStyledSpan(string line, string style)
        {
            return "<span style=\"" + style + "\">" + line + "</span>";
        }
    }
}

希望这会有所帮助。也看看 regex101 - online regex testerdebuggex - regex visualization。 (但请谨慎使用,正则表达式的工作方式有时会有所不同)。

【讨论】:

  • else if (Regex.IsMatch(line, "[")) 导致错误 Invalid pattern '[' at offset 1. Unterminated [] set.[ 是无效的正则表达式
  • 在有问题的代码中,只有部分行(日志条目类型)是彩色的:#033[40m#033[32minfo#033[39m#033[22m#033[49m: 信息为绿色,错误为红色。看起来答案中的代码试图为整行着色
  • 它将跨度添加到每行的开头并且不删除转义序列。我用输出更新了问题。
  • 举个例子,如果在您的问题中使用此代码会发生什么令人困惑。我对你的问题发表了评论。
猜你喜欢
  • 2013-06-14
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 2016-10-12
  • 2021-07-30
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
相关资源
最近更新 更多