Improve Logging For Disappearing Messages (#2332)

*   [x] Log updates to last message (message preview) in conversation list.
        Should help debug cases such as:
        https://github.com/signalapp/Signal-Desktop/issues/2323
*   [x] Use structured logs:
    *   [x] Use static prefix (easier to search)
    *   [x] Capitalize log message and use present tense
            (consistent with Git logging conventions).
    *   [x] Attach metadata as JSON serializable object. This has the benefit
            that all fields are named and can be searched for.
*   [x] Remove newlines from group IDs during redaction so they don’t break up
        log lines.
This commit is contained in:
Daniel Gasienica 2018-05-03 14:06:08 -04:00 committed by GitHub
commit f0896b53bc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 43 additions and 23 deletions

View File

@ -6,7 +6,9 @@
// Load messages that have expired and destroy them
var expired = new Whisper.MessageCollection();
expired.on('add', function(message) {
console.log('message', message.get('sent_at'), 'expired');
console.log('Message expired', {
sentAt: message.get('sent_at'),
});
var conversation = message.getConversation();
if (conversation) {
conversation.trigger('expired', message);

View File

@ -813,17 +813,24 @@
await collection.fetchConversation(this.id, 1);
const lastMessage = collection.at(0);
const lastMessageJSON = lastMessage ? lastMessage.toJSON() : null;
const lastMessageUpdate = window.Signal.Types.Conversation.createLastMessageUpdate(
{
currentLastMessageText: this.get('lastMessage') || null,
currentTimestamp: this.get('timestamp') || null,
lastMessage: lastMessage ? lastMessage.toJSON() : null,
lastMessage: lastMessageJSON,
lastMessageNotificationText: lastMessage
? lastMessage.getNotificationText()
: null,
}
);
console.log('Conversation: Update last message:', {
id: this.idForLogging() || null,
messageTimestamp: lastMessageUpdate.timestamp || null,
messageType: lastMessageJSON ? lastMessageJSON.type : null,
messageSentAt: lastMessageJSON ? lastMessageJSON.sent_at : null,
});
this.set(lastMessageUpdate);
if (this.hasChanged('lastMessage') || this.hasChanged('timestamp')) {
@ -853,14 +860,12 @@
return Promise.resolve();
}
console.log(
'Updating expireTimer for conversation',
this.idForLogging(),
'to',
console.log("Update conversation 'expireTimer'", {
id: this.idForLogging(),
expireTimer,
'via',
source
);
source,
});
source = source || textsecure.storage.user.getNumber();
const timestamp = receivedAt || Date.now();

View File

@ -632,13 +632,11 @@
const shouldLogExpireTimerChange =
message.isExpirationTimerUpdate() || expireTimer;
if (shouldLogExpireTimerChange) {
console.log(
'Updating expireTimer for conversation',
conversation.idForLogging(),
'to',
console.log("Update conversation 'expireTimer'", {
id: conversation.idForLogging(),
expireTimer,
'via `handleDataMessage`'
);
source: 'handleDataMessage',
});
}
if (!message.isEndSession() && !message.isGroupUpdate()) {
@ -847,7 +845,10 @@
}
Whisper.ExpiringMessagesListener.update();
console.log('message', this.get('sent_at'), 'expires at', expiresAt);
console.log('Set message expiration', {
expiresAt,
sentAt: this.get('sent_at'),
});
}
},
});
@ -961,7 +962,7 @@
},
fetchExpired() {
console.log('loading expired messages');
console.log('Load expired messages');
this.fetch({
conditions: { expires_at: { $lte: Date.now() } },
addIndividually: true,

View File

@ -73,7 +73,7 @@ exports.redactGroupIds = text => {
return text.replace(
GROUP_ID_PATTERN,
(match, before, id, after) =>
`${before}${REDACTION_PLACEHOLDER}${id.slice(-3)}${after}`
`${before}${REDACTION_PLACEHOLDER}${removeNewlines(id).slice(-3)}${after}`
);
};
@ -86,3 +86,5 @@ exports.redactAll = compose(
exports.redactGroupIds,
exports.redactPhoneNumbers
);
const removeNewlines = text => text.replace(/\r?\n|\r/g, '');

View File

@ -815,11 +815,9 @@
},
async onExpiredCollection(message) {
const removeMessage = () => {
console.log(
'removing message',
message.get('sent_at'),
'from collection'
);
console.log('Remove expired message from message collection', {
sentAt: message.get('sent_at'),
});
this.model.messageCollection.remove(message.id);
};

View File

@ -33,6 +33,18 @@ describe('Privacy', () => {
'and group([REDACTED]hij)';
assert.equal(actual, expected);
});
it('should remove newlines from redacted group IDs', () => {
const text =
'This is a log line with two group IDs: group(12345678\n9)\n' +
'and group(abc\ndefghij)';
const actual = Privacy.redactGroupIds(text);
const expected =
'This is a log line with two group IDs: group([REDACTED]789)\n' +
'and group([REDACTED]hij)';
assert.equal(actual, expected);
});
});
describe('redactAll', () => {