659e9bf2e6b64ca7c6f1ff8969e5fa0182f01481.svn-base
2.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*
* Couchdb.js: Transport for logging to Couchdb
*
* (C) 2011 Max Ogden
* MIT LICENSE
*
*/
var events = require('events'),
http = require('http'),
util = require('util'),
common = require('../common'),
Transport = require('./transport').Transport;
//
// ### function Couchdb (options)
// #### @options {Object} Options for this instance.
// Constructor function for the Console transport object responsible
// for making arbitrary HTTP requests whenever log messages and metadata
// are received.
//
var Couchdb = exports.Couchdb = function (options) {
Transport.call(this, options);
this.name = 'Couchdb';
this.db = options.db;
this.user = options.user;
this.pass = options.pass;
this.host = options.host || 'localhost';
this.port = options.port || 5984;
if (options.auth) {
//
// TODO: add http basic auth options for outgoing HTTP requests
//
}
if (options.ssl) {
//
// TODO: add ssl support for outgoing HTTP requests
//
}
};
//
// Inherit from `winston.Transport`.
//
util.inherits(Couchdb, Transport);
//
// Expose the name of this Transport on the prototype
//
Couchdb.prototype.name = 'Couchdb';
//
// ### function log (level, msg, [meta], callback)
// #### @level {string} Level at which to log the message.
// #### @msg {string} Message to log
// #### @meta {Object} **Optional** Additional metadata to attach
// #### @callback {function} Continuation to respond to when complete.
// Core logging method exposed to Winston. Metadata is optional.
//
Couchdb.prototype.log = function (level, msg, meta, callback) {
if (this.silent) {
return callback(null, true);
}
var self = this,
message = common.clone(meta || {}),
options,
req;
message.level = level;
message.message = msg;
// Prepare options for outgoing HTTP request
options = {
host: this.host,
port: this.port,
path: "/" + this.db,
method: "POST",
headers: {"content-type": "application/json"}
};
if (options.user && options.pass) {
options.headers["Authorization"] = "Basic " + new Buffer(options.user + ":" + options.pass).toString('base64');
}
// Perform HTTP logging request
req = http.request(options, function (res) {
//
// No callback on request, fire and forget about the response
//
self.emit('logged', res);
});
req.on('error', function (err) {
//
// Propagate the `error` back up to the `Logger` that this
// instance belongs to.
//
self.emit('error', err);
});
//
// Write logging event to the outgoing request body
//
req.write(JSON.stringify({
method: 'log',
params: {
timestamp: new Date(), // RFC3339/ISO8601 format instead of common.timestamp()
msg: msg,
level: level,
meta: meta
}
}));
req.end();
// Always return true, regardless of any errors
callback(null, true);
};