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:
commit
f0896b53bc
6 changed files with 43 additions and 23 deletions
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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, '');
|
||||||
|
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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', () => {
|
||||||
|
|
Loading…
Add table
Reference in a new issue