最后更新于2017年11月6日星期一21:19:12 GMT

node-js-as-a-proxy-to-logentries

从web应用程序的客户端进行日志记录似乎是一个挑战.  web浏览器向用户公开所有内容.  没有办法隐藏交付给客户端的任何东西, 包括您的日志令牌 Logentries log.  没有可靠的方法来保护令牌,因为浏览器中的所有内容都是纯文本.  直接从客户机浏览器进行日志记录可能会危及日志的有效性.

绝大多数用户会忽略这些信息.  Unfortunately, 您确实有将令牌暴露给少数用户的风险,这些用户可能将此作为恶作剧的机会.  使用该令牌,他们可以很容易地将错误数据发布到您的日志中.  重要的是要避免任何可能危及日志数据可靠性的事情.

直接访问可能不是一种选择,但还有其他方法可以将数据发送到Logentries日志,而不会有暴露的风险.  这篇文章将介绍多年来最常用的成功方法之一:代理.  使用简单节点.js server, 我们将介绍如何创建一个可以接受来自客户机的日志数据的代理服务器, 并将其转发到Logentries中的正确日志.  Node.Js是本文选择的服务器, 但是这种方法对于任何能够接收HTTP POST请求的web服务器都是可行的.

该体系结构

屏幕-射- 2016 - 11 - 18 - 3 - 46 - 36点

架构很简单.  客户端将通过预先配置的路由将日志数据发送到web服务器.  服务器将从安全文件中读取正确的日志令牌.   最后,服务器将把所有数据从预配置的路由转发到Logentries.使用加载的日志令牌.

作为代理的服务器可以做的不仅仅是向前传送数据.  在我们的示例中,代码在接收数据时除了移动数据外不会对其进行任何操作.  However, 在一个更强健的环境中, 代理可以向消息中添加数据, 它可以清除信息, 甚至重新格式化数据.

服务器有两个主要文件:

  1. token.json -该文件存储日志令牌.  它可以根据需要存储额外的配置信息.  The token.Json文件可以锁定到特定的用户,从而阻止它被随意读取.

  2. server.这是代理服务器代码.  服务器使用非常流行的Node.. js web服务器称为Express.

app目录保存着客户端应用程序代码.  这些文件对于运行代理来说不是必需的.  它们提供了如何传送日志数据的示例.

The Server

让我们看一下服务器代码.

Var express = require('express');
Var parser = require('body-parser');
Var fs = require('fs');
Var = require('le_node');

Var token = ";
var logger;

前三个变量是服务器作为web服务器运行和解释传入信息所需的包.  第四个变量“le”是Logentries Javascript库.  最后两个变量将用作环境全局变量,用于存储令牌值和对Logentries Logger对象的引用.

try{
    fs.statSync(“令牌.json');
    token = JSON.parse(fs.readFileSync(“令牌.json')).token;
    log = new le({
        token:token,
        console: true
    });
}catch (e){
    console.error (e.toString());
    process.exit()
}

本节读取并存储存储在JSON文件中的令牌值.  我们将其包装在try/catch中,以便通知管理员是否使用了令牌.缺少Json.  如果没有,我们就彻底关闭服务器.  Once token.当读取到json时,服务器使用Logentries配置对象中的令牌id.  接下来,代码加载Logentries日志对象.  关于日志记录器本身的其他选项和更多细节是可用的 here.

Var app = express();
app.use(express.静态(“软件”));
app.use(parser.urlencoded({扩展:假}));

这里我们启动Express.  代码告诉Express从“app”目录中读取静态资源.  Finally, 它将传入的数据解析为一个JSON对象,该对象在请求的主体对象上可用.

app.Post ('/log', function (req, res) {
  try{
    var vals = req.body;
    var msg = vals.msg;

    logger[vals.type](msg);
    res.sendStatus (200);

  }catch (e){
    logger.err(e);
    res.status(400).send(e.message);
  }
});

这就是日志记录的神奇之处.  服务器监听通过“log”路由发送到服务器的数据.  发送到/log服务器的任何内容都要经过这个代码块.

代码从传入请求(req)体中获取数据.  “msg”字段包含要发送的日志数据.  客户端在“type”字段中发送要创建的日志类型(“info”、“error”等).  这两个字段的组合告诉Logentries日志对象使用提供的消息发送指定类型的日志.

我们的try-catch块是为了避免错误终止服务器.  如果服务器出现错误, 它将一个400状态码连同错误消息一起发送给客户机.

这段代码为我们提供了一个有效的代理.  我们的客户端应用程序所要做的就是向/log路由发送一条消息.  服务器将消息发送到正确的Logentries日志.  In tests, 从客户端触发后的几秒钟内,日志就可以在Logentries日志中看到.

客户端代码

大多数浏览器代码都是HTML,应该很容易解码.  大部分过程都发生在应用程序中.sendLog函数中的. js文件.  让我们回顾一下这个函数:

sendLog(type, msg) {
    $.ajax({
        url: '/log',
        方法:“文章”,
        data: {
            “类型”:$ (' # logType ').val(),
            “味精”:$(“#味精”).val()
        },
        成功:函数(){
            $('#result').文本('恭喜你! 您在未公开日志令牌的情况下记录了客户端消息.');
            $('#result').show();
        },
        错误:function (err){
            $('#result').text('Ooops! 发生错误:' + err.responseText);
            $('#result').show();
        }
    });
}

该函数使用jquery对服务器进行AJAX调用.  它向“/log”路由发送一个post请求.  浏览器将选择框的值和消息字段从UI传递到数据部分, 哪个服务器解析器将转换为主体对象.  这就是将日志数据发送到代理以交付给logentry所需要的全部内容.

Conclusion

使用代理来保护日志令牌免受客户端篡改应该被视为最佳实践.  将有关基础设施的有价值的信息从浏览器中删除总是一个好主意.  Node.js, 或者任何web服务器, 能否在保护您的隐私的同时提供一种出色的路径来传递日志数据.

可以找到这个概念证明的代码 here. Happy Logging!


准备开始集中和分析您的Node.js data? Start a Logentries免费试用 今天开始.