Skip to content
This repository has been archived by the owner on Jul 12, 2019. It is now read-only.

Fix missed logs #91

Merged
merged 1 commit into from
May 23, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 22 additions & 1 deletion src/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,26 @@ const SENSITIVE_KEYS = [
'token'
];

const SAFE_LOG_KEYS = [
'account_id',
'api_title',
'app_cli_id',
'app_cli_title',
'app_cli_version',
'app_cli_version_id',
'customuser_id',
'facility',
'object_action',
'object_id',
'object_root_id',
'object_type',
'request_method',
'request_type',
'response_status_code',
'selected_api',
'timestamp'
];

module.exports = {
IS_TESTING,
KILL_MIN_LIMIT,
Expand All @@ -41,5 +61,6 @@ module.exports = {
REQUEST_OBJECT_SHORTHAND_OPTIONS,
DEFAULT_LOGGING_HTTP_ENDPOINT,
DEFAULT_LOGGING_HTTP_API_KEY,
SENSITIVE_KEYS
SENSITIVE_KEYS,
SAFE_LOG_KEYS
};
8 changes: 7 additions & 1 deletion src/tools/create-logger.js
Original file line number Diff line number Diff line change
Expand Up @@ -106,13 +106,19 @@ const sendLog = (options, event, message, data) => {
);
const unsafeData = dataTools.recurseReplace(data, truncate);

// Keep safe log keys uncensored
Object.keys(safeData).forEach(key => {
if (constants.SAFE_LOG_KEYS.indexOf(key) !== -1) {
safeData[key] = unsafeData[key];
}
});

const body = {
message: safeMessage,
data: safeData,
token: options.token
};

// TODO: auth data
const httpOptions = {
url: options.endpoint,
method: 'POST',
Expand Down
178 changes: 96 additions & 82 deletions test/logger.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,52 +11,46 @@ describe('logger', () => {

// httpbin/post echoes all the input body and headers in the response

it('should log to graylog', done => {
it('should log to graylog', () => {
const event = {};
const logger = createlogger(event, options);
const data = { key: 'val' };

logger('test', data)
.then(response => {
response.headers.get('content-type').should.eql('application/json');
response.status.should.eql(200);
response.content.json.should.eql({
token: 'fake-token',
message: 'test',
data: {
log_type: 'console',
key: 'val'
}
});
done();
})
.catch(done);
return logger('test', data).then(response => {
response.headers.get('content-type').should.eql('application/json');
response.status.should.eql(200);
response.content.json.should.eql({
token: options.token,
message: 'test',
data: {
log_type: 'console',
key: 'val'
}
});
});
});

it('should include bundle meta', done => {
it('should include bundle meta', () => {
const logExtra = {
'meta-key': 'meta-value'
};

const logger = createlogger({ logExtra }, options);

logger('test')
.then(response => {
response.status.should.eql(200);
response.content.json.should.eql({
token: 'fake-token',
message: 'test',
data: {
log_type: 'console',
'meta-key': 'meta-value'
}
});
done();
})
.catch(done);
return logger('test').then(response => {
response.status.should.eql(200);
response.content.json.should.eql({
token: options.token,
message: 'test',
data: {
log_type: 'console',
'meta-key': 'meta-value'
}
});
});
});

it('should replace auth data', done => {
it('should replace auth data', () => {
const bundle = {
authData: {
password: 'secret',
Expand All @@ -67,24 +61,21 @@ describe('logger', () => {

const data = bundle.authData;

logger('test', data)
.then(response => {
response.status.should.eql(200);
response.content.json.should.eql({
token: 'fake-token',
message: 'test',
data: {
password: ':censored:6:a5023f748d:',
log_type: 'console',
key: ':censored:6:8f63f9ff57:'
}
});
done();
})
.catch(done);
return logger('test', data).then(response => {
response.status.should.eql(200);
response.content.json.should.eql({
token: options.token,
message: 'test',
data: {
password: ':censored:6:a5023f748d:',
log_type: 'console',
key: ':censored:6:8f63f9ff57:'
}
});
});
});

it('should replace sensitive data inside strings', done => {
it('should replace sensitive data inside strings', () => {
const bundle = {
authData: {
password: 'secret',
Expand All @@ -100,26 +91,23 @@ describe('logger', () => {
}`
};

logger('test', data)
.then(response => {
response.status.should.eql(200);
response.content.json.should.eql({
token: 'fake-token',
message: 'test',
data: {
response_content: `{
return logger('test', data).then(response => {
response.status.should.eql(200);
response.content.json.should.eql({
token: options.token,
message: 'test',
data: {
response_content: `{
"something": ":censored:6:a5023f748d:",
"somethingElse": ":censored:6:8f63f9ff57:",
}`,
log_type: 'console'
}
});
done();
})
.catch(done);
log_type: 'console'
}
});
});
});

it('should replace sensitive data inside response', done => {
it('should replace sensitive data inside response', () => {
const bundle = {
authData: {
refresh_token: 'whatever'
Expand All @@ -140,28 +128,54 @@ describe('logger', () => {
}`
};

logger('test', data)
.then(response => {
response.status.should.eql(200);
response.content.json.should.eql({
token: 'fake-token',
message: 'test',
data: {
response_json: {
access_token: ':censored:12:8e4a58294b:',
PASSWORD: ':censored:10:b0c55acfea:',
name: 'not so secret'
},
response_content: `{
return logger('test', data).then(response => {
response.status.should.eql(200);
response.content.json.should.eql({
token: options.token,
message: 'test',
data: {
response_json: {
access_token: ':censored:12:8e4a58294b:',
PASSWORD: ':censored:10:b0c55acfea:',
name: 'not so secret'
},
response_content: `{
"access_token": ":censored:12:8e4a58294b:",
"PASSWORD": ":censored:10:b0c55acfea:",
"name": "not so secret"
}`,
log_type: 'console'
}
});
done();
})
.catch(done);
log_type: 'console'
}
});
});
});

it('should not replace safe log keys', () => {
const bundle = {
authData: {
password: 'secret',
key: '123456789'
}
};
const logExtra = {
customuser_id: '123456789' // This is a safe log key
};
const logger = createlogger({ bundle, logExtra }, options);

const data = bundle.authData;

return logger('test', data).then(response => {
response.status.should.eql(200);
response.content.json.should.eql({
token: options.token,
message: 'test',
data: {
password: ':censored:6:a5023f748d:',
log_type: 'console',
key: ':censored:9:699f352527:',
customuser_id: logExtra.customuser_id
}
});
});
});
});