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 // Load messages that have expired and destroy them
var expired = new Whisper.MessageCollection(); var expired = new Whisper.MessageCollection();
expired.on('add', function(message) { 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(); var conversation = message.getConversation();
if (conversation) { if (conversation) {
conversation.trigger('expired', message); conversation.trigger('expired', message);

View file

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

View file

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

View file

@ -73,7 +73,7 @@ exports.redactGroupIds = text => {
return text.replace( return text.replace(
GROUP_ID_PATTERN, GROUP_ID_PATTERN,
(match, before, id, after) => (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.redactGroupIds,
exports.redactPhoneNumbers exports.redactPhoneNumbers
); );
const removeNewlines = text => text.replace(/\r?\n|\r/g, '');

View file

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

View file

@ -33,6 +33,18 @@ describe('Privacy', () => {
'and group([REDACTED]hij)'; 'and group([REDACTED]hij)';
assert.equal(actual, expected); 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', () => { describe('redactAll', () => {