3

我正在使用 mongodb 将应用程序错误日志存储为 json 文档。我希望能够将错误日志格式化为 HTML,而不是将纯 json 返回到浏览器。日志是无模式的——它们可以随时更改,所以尝试这样做是没有用的(在 Jade 中):

    - var items = jsonResults

    - each item in items
        h3 Server alias: #{item.ServerAlias}
        p UUID: #{item.UUID}
        p Stack trace: #{item.StackTrace}
            h3 Session: #{item.Session}
            p URL token: #{item.Session.UrlToken}
            p Session messages: #{item.Session.SessionMessages}

因为我不知道 JSON 结构中实际会出现什么。不过,我想要的肯定是可能的?我正在阅读的所有内容都表明该架构不是由数据库强制执行的,但是您的视图代码无论如何都会概述您的架构 - 但是我们有数百个可能的字段可以随时删除或添加,因此管理视图这种方式是相当难以管理的。

我错过了什么?我是否对技术做出了错误的假设?走错路了?


编辑了以下评论的额外信息:

json 文档看起来像这样

{
   "ServerAlias":"GBIZ-WEB",
   "Session":{
      "urltoken":"CFID=10989&CFTOKEN=f07fe950-53926E3B-F33A-093D-3FCEFB&jsessionid=84303d29a229d1",
      "captcha":{

      },
      "sessionmessages":{

      },
      "sessionid":"84197a667053f63433672873j377e7d379101"
   },
   "UUID":"53934LBB-DB8F-79T6-C03937JD84HB864A338",
   "Template":"\/home\/vagrant\/dev\/websites\/g-bis\/code\/webroot\/page\/home\/home.cfm, line 3",
   "Error":{
      "GeneratedContent":"",
      "Mailto":"",
      "RootCause":{
         "Message":"Unknown tag: cfincflude.",
         "tagName":"cfincflude",
         "TagContext":[
            {
               "RAW_TRACE":"\tat cfhome2ecfm1296628853.runPage(\/home\/vagrant\/dev\/websites\/nig-bis\/code\/webroot\/page\/home\/home.cfm:3)",
               "ID":"CFINCLUDE",
               "TEMPLATE":"\/home\/vagrant\/dev\/websites\/nig-bis\/code\/webroot\/page\/home\/home.cfm",
               "LINE":3,
               "TYPE":"CFML",
               "COLUMN":0
            },
            {
               "RAW_TRACE":"\tat cfdisplay2ecfm1093821753.runPage(\/home\/vagrant\/dev\/websites\/nig-bis\/code\/webroot\/page\/display.cfm:6)",
               "ID":"CFINCLUDE",
               "TEMPLATE":"\/home\/vagrant\/dev\/websites\/nig-bis\/code\/webroot\/page\/display.cfm",
               "LINE":6,
               "TYPE":"CFML",
               "COLUMN":0
            }
         ]
       }
   }

...等,但可能会根据生成日志的单个项目配置为触发而改变。

我最终想要的是一个格式化的 HTML 页面,其中包含下面列出的每个父级和子级的标题,并直接遍历数据结构。上面的 Jade 示例实际上是我们需要输出的内容,但没有在视图中对其进行硬编码。

Mike 在评论中对问题的分析是,从一堆没有太多共同点的集合中创建一个类似表格的结构,这一点非常成功。数据是相关的,但仅在单个文档中 - 因此将模式硬编码到任何内容中几乎是不可能的,因为它需要您首先知道数据结构的样子。

4

3 回答 3

2

基本思想是@Gates VP 所描述的。我使用underscore.js遍历数组/对象。

function formatLog(obj){
  var log = "";
  _.each(obj, function(val, key){ 
    if(typeof(val) === "object" || typeof(val) === "array"){
      // if we have a new list
      log += "<ul>";
      log += formatLog(val);
      log += "</ul>";
    }
    else{
      // if we are at an endpoint
      log += "<li>";
      log += (key + ": " + val);
      log += "</li>";
    }
  });
  return log;
}

如果你调用formatLog()你给它的示例数据返回

  • 服务器别名:GBIZ-WEB
    • urltoken:CFID=10989&CFTOKEN=f07fe950-53926E3B-F33A-093D-3FCEFB&jsessionid=84303d29a229d1
        • sessionid: 84197a667053f63433672873j377e7d379101
      • UUID:53934LBB-DB8F-79T6-C03937JD84HB864A338
      • 模板:/home/vagrant/dev/websites/g-bis/code/webroot/page/home/home.cfm,第 3 行
        • 生成内容:
        • 邮寄:
          • 消息:未知标签:cfincflude。
          • 标记名称:cfincflude
              • RAW_TRACE:在 cfhome2ecfm1296628853.runPage(/home/vagrant/dev/websites/nig-bis/code/webroot/page/home/home.cfm:3)
              • 编号:CFINCLUDE
              • 模板:/home/vagrant/dev/websites/nig-bis/code/webroot/page/home/home.cfm
              • 线路:3
              • 类型:CFML
              • 栏目:0
              • RAW_TRACE:在 cfdisplay2ecfm1093821753.runPage(/home/vagrant/dev/websites/nig-bis/code/webroot/page/display.cfm:6)
              • 编号:CFINCLUDE
              • 模板:/home/vagrant/dev/websites/nig-bis/code/webroot/page/display.cfm
              • 线路:6
              • 类型:CFML
              • 栏目:0

      然后如何格式化它取决于您。

      于 2012-07-20T00:17:40.960 回答
      1

      这基本上是一个递归for循环。

      要使用 Jade 执行此操作,您将需要使用 mixins,以便您可以通过调用具有更深缩进级别的 mixin 来打印嵌套对象。

      请注意,这整个事情有点难看,因为您无法保证字段的顺序,并且您可能必须实现一些逻辑来区分数组上的循环与 JSON 对象上的循环。

      于 2012-07-19T17:38:23.790 回答
      0

      你可以试试 util.inspect。在您的模板中:

      pre
        = util.inspect(jsonResults)
      
      于 2012-07-19T13:07:15.433 回答