2 var layouts = require('../layouts')
3 , loggly = require('loggly')
5 , passThrough = layouts.messagePassThroughLayout;
8 function isAnyObject(value) {
9 return value !== null && (typeof value === 'object' || typeof value === 'function');
15 if (o.hasOwnProperty(k)) res++;
21 * @param msg - array of args for logging.
22 * @returns { deTaggedMsg: [], additionalTags: [] }
24 function processTags(msgListArgs) {
25 var msgList = (msgListArgs.length === 1 ? [msgListArgs[0]] : Array.apply(null, msgListArgs));
27 return msgList.reduce(function (accum, element, currentIndex, array) {
28 if (isAnyObject(element) && Array.isArray(element.tags) && numKeys(element) == 1) {
29 accum.additionalTags = accum.additionalTags.concat(element.tags);
31 accum.deTaggedData.push(element);
34 }, { deTaggedData: [], additionalTags: [] });
38 * Loggly Appender. Sends logging events to Loggly using node-loggly, optionally adding tags.
40 * This appender will scan the msg from the logging event, and pull out any argument of the
41 * shape `{ tags: [] }` so that it's possibleto add tags in a normal logging call.
45 * logger.info({ tags: ['my-tag-1', 'my-tag-2'] }, 'Some message', someObj, ...)
47 * And then this appender will remove the tags param and append it to the config.tags.
49 * @param config object with loggly configuration data
51 * token: 'your-really-long-input-token',
52 * subdomain: 'your-subdomain',
53 * tags: ['loggly-tag1', 'loggly-tag2', .., 'loggly-tagn']
55 * @param layout a function that takes a logevent and returns a string (defaults to objectLayout).
57 function logglyAppender(config, layout) {
58 var client = loggly.createClient(config);
59 if(!layout) layout = passThrough;
61 return function(loggingEvent) {
62 var result = processTags(loggingEvent.data);
63 var deTaggedData = result.deTaggedData;
64 var additionalTags = result.additionalTags;
66 // Replace the data property with the deTaggedData
67 loggingEvent.data = deTaggedData;
69 var msg = layout(loggingEvent);
73 level: loggingEvent.level.levelStr,
74 category: loggingEvent.categoryName,
75 hostname: os.hostname().toString(),
80 function configure(config) {
83 layout = layouts.layout(config.layout.type, config.layout);
85 return logglyAppender(config, layout);
88 exports.name = 'loggly';
89 exports.appender = logglyAppender;
90 exports.configure = configure;