Browse Source

Extend [LoggerMessage] source generation to all projects using ILogger

pull/1318/head
copilot-swe-agent[bot] 2 weeks ago
committed by GitHub
parent
commit
d456fe51ab
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 2
      backend/extensions/Squidex.Extensions/Actions/Kafka/KafkaProducer.cs
  2. 2
      backend/extensions/Squidex.Extensions/Assets/Azure/AzureMetadataSource.cs
  3. 19
      backend/extensions/Squidex.Extensions/LogMessages.cs
  4. 16
      backend/src/Squidex.Data.MongoDb/Infrastructure/Counts/LogMessages.cs
  5. 2
      backend/src/Squidex.Data.MongoDb/Infrastructure/Counts/MongoCountCollection.cs
  6. 6
      backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleService.cs
  7. 22
      backend/src/Squidex.Domain.Apps.Core.Operations/LogMessages.cs
  8. 2
      backend/src/Squidex.Domain.Apps.Entities/Assets/RecursiveDeleter.cs
  9. 8
      backend/src/Squidex.Domain.Apps.Entities/Backup/RestoreJob.cs
  10. 2
      backend/src/Squidex.Domain.Apps.Entities/Collaboration/CommentCollaborationHandler.cs
  11. 6
      backend/src/Squidex.Domain.Apps.Entities/Collaboration/EmailUserNotifications.cs
  12. 4
      backend/src/Squidex.Domain.Apps.Entities/Contents/ContentSchedulerProcess.cs
  13. 4
      backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ErrorVisitor.cs
  14. 8
      backend/src/Squidex.Domain.Apps.Entities/History/NotifoService.cs
  15. 4
      backend/src/Squidex.Domain.Apps.Entities/Invitation/InvitationEventConsumer.cs
  16. 10
      backend/src/Squidex.Domain.Apps.Entities/Jobs/JobProcessor.cs
  17. 92
      backend/src/Squidex.Domain.Apps.Entities/LogMessages.cs
  18. 6
      backend/src/Squidex.Domain.Apps.Entities/Rules/RuleQueueWriter.cs
  19. 6
      backend/src/Squidex.Domain.Apps.Entities/Rules/Runner/RuleRunnerJob.cs
  20. 2
      backend/src/Squidex.Domain.Apps.Entities/Search/SearchManager.cs
  21. 2
      backend/src/Squidex.Domain.Users/DefaultUserService.cs
  22. 19
      backend/src/Squidex.Domain.Users/LogMessages.cs
  23. 2
      backend/src/Squidex.Domain.Users/UserManagerExtensions.cs
  24. 6
      backend/src/Squidex/Areas/Api/Controllers/Users/UsersController.cs
  25. 2
      backend/src/Squidex/Areas/IdentityServer/Config/CreateAdminInitializer.cs
  26. 25
      backend/src/Squidex/LogMessages.cs

2
backend/extensions/Squidex.Extensions/Actions/Kafka/KafkaProducer.cs

@ -104,7 +104,7 @@ public sealed class KafkaProducer
private static void LogError(ILogger<KafkaProducer> log, Error error) private static void LogError(ILogger<KafkaProducer> log, Error error)
{ {
log.LogWarning("Kafka error with {code} and {reason}.", error.Code, error.Reason); LogMessages.LogKafkaError(log, error.Code, error.Reason);
} }
public async Task SendAsync(KafkaMessageRequest job, public async Task SendAsync(KafkaMessageRequest job,

2
backend/extensions/Squidex.Extensions/Assets/Azure/AzureMetadataSource.cs

@ -84,7 +84,7 @@ public sealed class AzureMetadataSource : IAssetMetadataSource
} }
catch (Exception ex) catch (Exception ex)
{ {
log.LogError(ex, "Failed to enrich asset."); LogMessages.LogFailedToEnrichAsset(log, ex);
} }
} }

19
backend/extensions/Squidex.Extensions/LogMessages.cs

@ -0,0 +1,19 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Microsoft.Extensions.Logging;
namespace Squidex.Extensions;
internal static partial class LogMessages
{
[LoggerMessage(Level = LogLevel.Warning, Message = "Kafka error with {code} and {reason}.")]
public static partial void LogKafkaError(ILogger logger, object code, string reason);
[LoggerMessage(Level = LogLevel.Error, Message = "Failed to enrich asset.")]
public static partial void LogFailedToEnrichAsset(ILogger logger, Exception exception);
}

16
backend/src/Squidex.Data.MongoDb/Infrastructure/Counts/LogMessages.cs

@ -0,0 +1,16 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Microsoft.Extensions.Logging;
namespace Squidex.Infrastructure.Counts;
internal static partial class LogMessages
{
[LoggerMessage(Level = LogLevel.Error, Message = "Failed to update count for collection {collection}.")]
public static partial void LogFailedToUpdateCount(ILogger logger, string collection, Exception exception);
}

2
backend/src/Squidex.Data.MongoDb/Infrastructure/Counts/MongoCountCollection.cs

@ -50,7 +50,7 @@ internal sealed class MongoCountCollection(IMongoDatabase database, ILogger log,
} }
catch (Exception ex) catch (Exception ex)
{ {
log.LogError(ex, "Failed to update count for collection {collection}.", collectionName); LogMessages.LogFailedToUpdateCount(log, collectionName, ex);
} }
} }

6
backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleService.cs

@ -108,7 +108,7 @@ public sealed class RuleService(
CreateJobs(@event, context, states, ct) CreateJobs(@event, context, states, ct)
.Catch(ex => .Catch(ex =>
{ {
log.LogError(ex, "Failed to create rule job."); LogMessages.LogFailedToCreateRuleJob(log, ex);
return states.Select(state => JobResult.Skipped(state.Rule, SkipReason.Failed)); return states.Select(state => JobResult.Skipped(state.Rule, SkipReason.Failed));
}); });
@ -237,7 +237,7 @@ public sealed class RuleService(
CreateTriggerJobs(typed, triggerHandler, rulesByTrigger, context, ct) CreateTriggerJobs(typed, triggerHandler, rulesByTrigger, context, ct)
.Catch(ex => .Catch(ex =>
{ {
log.LogError(ex, "Failed to create rule jobs from trigger."); LogMessages.LogFailedToCreateRuleJobsFromTrigger(log, ex);
return states.Select(state => JobResult.Skipped(state.Rule, SkipReason.Failed)); return states.Select(state => JobResult.Skipped(state.Rule, SkipReason.Failed));
}); });
@ -263,7 +263,7 @@ public sealed class RuleService(
CreateEventJobs(@event, enrichedEvent, triggerHandler, states, context) CreateEventJobs(@event, enrichedEvent, triggerHandler, states, context)
.Catch(ex => .Catch(ex =>
{ {
log.LogError(ex, "Failed to create rule jobs from event."); LogMessages.LogFailedToCreateRuleJobsFromEvent(log, ex);
return states.Select(state => return states.Select(state =>
new JobResult new JobResult

22
backend/src/Squidex.Domain.Apps.Core.Operations/LogMessages.cs

@ -0,0 +1,22 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Microsoft.Extensions.Logging;
namespace Squidex.Domain.Apps.Core;
internal static partial class LogMessages
{
[LoggerMessage(Level = LogLevel.Error, Message = "Failed to create rule job.")]
public static partial void LogFailedToCreateRuleJob(ILogger logger, Exception exception);
[LoggerMessage(Level = LogLevel.Error, Message = "Failed to create rule jobs from trigger.")]
public static partial void LogFailedToCreateRuleJobsFromTrigger(ILogger logger, Exception exception);
[LoggerMessage(Level = LogLevel.Error, Message = "Failed to create rule jobs from event.")]
public static partial void LogFailedToCreateRuleJobsFromEvent(ILogger logger, Exception exception);
}

2
backend/src/Squidex.Domain.Apps.Entities/Assets/RecursiveDeleter.cs

@ -58,7 +58,7 @@ public sealed class RecursiveDeleter(
} }
catch (Exception ex) catch (Exception ex)
{ {
log.LogError(ex, "Failed to delete asset recursively."); LogMessages.LogFailedToDeleteAssetRecursively(log, ex);
} }
} }

8
backend/src/Squidex.Domain.Apps.Entities/Backup/RestoreJob.cs

@ -107,7 +107,7 @@ public sealed class RestoreJob(
await context.LogAsync(" * Restore all objects like app, schemas and contents"); await context.LogAsync(" * Restore all objects like app, schemas and contents");
await context.LogAsync(" * Complete the restore operation for all objects"); await context.LogAsync(" * Complete the restore operation for all objects");
await context.FlushAsync(); await context.FlushAsync();
log.LogInformation("Backup with job id {backupId} with from URL '{url}' started.", context.Job.Id, state.Url); LogMessages.LogRestoreJobStarted(log, context.Job.Id, state.Url);
state.Reader = await DownloadAsync(context, state, ct); state.Reader = await DownloadAsync(context, state, ct);
@ -147,7 +147,7 @@ public sealed class RestoreJob(
await AssignContributorAsync(context, state); await AssignContributorAsync(context, state);
await context.LogAsync("Completed, Yeah!"); await context.LogAsync("Completed, Yeah!");
log.LogInformation("Backup with job id {backupId} from URL '{url}' completed.", context.Job.Id, state.Url); LogMessages.LogRestoreJobCompleted(log, context.Job.Id, state.Url);
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -168,7 +168,7 @@ public sealed class RestoreJob(
await context.LogAsync(message); await context.LogAsync(message);
log.LogError(ex, "Backup with job id {backupId} from URL '{url}' failed.", context.Job.Id, state.Url); LogMessages.LogRestoreJobFailed(log, context.Job.Id, state.Url, ex);
throw; throw;
} }
finally finally
@ -231,7 +231,7 @@ public sealed class RestoreJob(
} }
catch (Exception ex) catch (Exception ex)
{ {
log.LogError(ex, "Failed to clean up restore."); LogMessages.LogFailedToCleanUpRestore(log, ex);
} }
} }
} }

2
backend/src/Squidex.Domain.Apps.Entities/Collaboration/CommentCollaborationHandler.cs

@ -116,7 +116,7 @@ public sealed partial class CommentCollaborationHandler(
catch (Exception ex) catch (Exception ex)
{ {
// We are in an extra task, so the exception would be probably swallowed. // We are in an extra task, so the exception would be probably swallowed.
log.LogError(ex, "Failed to handle yjs event."); LogMessages.LogFailedToHandleYjsEvent(log, ex);
throw; throw;
} }
}); });

6
backend/src/Squidex.Domain.Apps.Entities/Collaboration/EmailUserNotifications.cs

@ -123,13 +123,13 @@ public sealed class EmailUserNotifications(
{ {
if (string.IsNullOrWhiteSpace(emailBody)) if (string.IsNullOrWhiteSpace(emailBody))
{ {
log.LogWarning("Cannot send email to {email}: No email subject configured for template {template}.", template, user.Email); LogMessages.LogNoEmailSubjectConfigured(log, template, user.Email);
return; return;
} }
if (string.IsNullOrWhiteSpace(emailSubj)) if (string.IsNullOrWhiteSpace(emailSubj))
{ {
log.LogWarning("Cannot send email to {email}: No email body configured for template {template}.", template, user.Email); LogMessages.LogNoEmailBodyConfigured(log, template, user.Email);
return; return;
} }
@ -146,7 +146,7 @@ public sealed class EmailUserNotifications(
} }
catch (Exception ex) catch (Exception ex)
{ {
log.LogError(ex, "Failed to send notification to {email}.", user.Email); LogMessages.LogFailedToSendNotification(log, user.Email, ex);
throw; throw;
} }
} }

4
backend/src/Squidex.Domain.Apps.Entities/Contents/ContentSchedulerProcess.cs

@ -55,7 +55,7 @@ public sealed class ContentSchedulerProcess(
} }
catch (Exception ex) catch (Exception ex)
{ {
log.LogError(ex, "Failed to query scheduled status changes-"); LogMessages.LogFailedToQueryScheduledStatusChanges(log, ex);
} }
} }
@ -88,7 +88,7 @@ public sealed class ContentSchedulerProcess(
} }
catch (Exception ex) catch (Exception ex)
{ {
log.LogError(ex, "Failed to execute scheduled status change for content '{contentId}'.", content.Id); LogMessages.LogFailedToExecuteScheduledStatusChange(log, content.Id, ex);
} }
} }
} }

4
backend/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ErrorVisitor.cs

@ -26,11 +26,11 @@ internal static class ErrorVisitor
if (!string.IsNullOrWhiteSpace(fieldName)) if (!string.IsNullOrWhiteSpace(fieldName))
{ {
log.LogError(context.OriginalException, "Failed to resolve field {field}.", fieldName); LogMessages.LogFailedToResolveField(log, fieldName, context.OriginalException);
} }
else else
{ {
log.LogError(context.OriginalException, "Failed to resolve execute query."); LogMessages.LogFailedToResolveQuery(log, context.OriginalException);
} }
if (context.OriginalException is ValidationException or DomainException) if (context.OriginalException is ValidationException or DomainException)

8
backend/src/Squidex.Domain.Apps.Entities/History/NotifoService.cs

@ -128,11 +128,11 @@ public class NotifoService : IUserEvents
} }
catch (NotifoException ex) catch (NotifoException ex)
{ {
log.LogError(ex, "Failed to register user in notifo: {details}.", ex.ToString()); LogMessages.LogFailedToRegisterUserInNotifoWithDetails(log, ex.ToString(), ex);
} }
catch (Exception ex) catch (Exception ex)
{ {
log.LogError(ex, "Failed to register user in notifo."); LogMessages.LogFailedToRegisterUserInNotifo(log, ex);
} }
} }
@ -191,11 +191,11 @@ public class NotifoService : IUserEvents
} }
catch (NotifoException ex) catch (NotifoException ex)
{ {
log.LogError(ex, "Failed to push user to notifo: {details}.", ex.ToString()); LogMessages.LogFailedToPushUserToNotifoWithDetails(log, ex.ToString(), ex);
} }
catch (Exception ex) catch (Exception ex)
{ {
log.LogError(ex, "Failed to push user to notifo."); LogMessages.LogFailedToPushUserToNotifo(log, ex);
} }
} }

4
backend/src/Squidex.Domain.Apps.Entities/Invitation/InvitationEventConsumer.cs

@ -106,7 +106,7 @@ public sealed class InvitationEventConsumer(
if (assigner == null) if (assigner == null)
{ {
log.LogWarning("Failed to invite user: Assigner {assignerId} not found.", assignerId); LogMessages.LogInvitationAssignerNotFound(log, assignerId);
return default; return default;
} }
@ -114,7 +114,7 @@ public sealed class InvitationEventConsumer(
if (assignee == null) if (assignee == null)
{ {
log.LogWarning("Failed to invite user: Assignee {assigneeId} not found.", assigneeId); LogMessages.LogInvitationAssigneeNotFound(log, assigneeId);
return default; return default;
} }

10
backend/src/Squidex.Domain.Apps.Entities/Jobs/JobProcessor.cs

@ -59,7 +59,7 @@ public sealed class JobProcessor
if (pending.Any()) if (pending.Any())
{ {
// This should actually never happen, so we log with warning. // This should actually never happen, so we log with warning.
log.LogWarning("Removed unfinished jobs for owner {ownerId} after start.", ownerId); LogMessages.LogRemovedUnfinishedJobs(log, ownerId);
foreach (var job in pending.ToList()) foreach (var job in pending.ToList())
{ {
@ -81,7 +81,7 @@ public sealed class JobProcessor
{ {
return scheduler.ScheduleAsync(async _ => return scheduler.ScheduleAsync(async _ =>
{ {
log.LogInformation("Clearing jobs for owner {ownerId}.", ownerId); LogMessages.LogClearingJobs(log, ownerId);
var job = state.Value.Jobs.Find(x => x.Id == jobId); var job = state.Value.Jobs.Find(x => x.Id == jobId);
@ -105,7 +105,7 @@ public sealed class JobProcessor
{ {
return scheduler.ScheduleAsync(async _ => return scheduler.ScheduleAsync(async _ =>
{ {
log.LogInformation("Clearing jobs for owner {ownerId}.", ownerId); LogMessages.LogClearingJobs(log, ownerId);
foreach (var job in state.Value.Jobs) foreach (var job in state.Value.Jobs)
{ {
@ -164,7 +164,7 @@ public sealed class JobProcessor
OwnerId = ownerId, OwnerId = ownerId,
}; };
log.LogInformation("Starting new backup with backup id '{backupId}' for owner {ownerId}.", context.Job.Id, ownerId); LogMessages.LogStartingJob(log, context.Job.Id, ownerId);
state.Value.Jobs.Insert(0, context.Job); state.Value.Jobs.Insert(0, context.Job);
try try
@ -221,7 +221,7 @@ public sealed class JobProcessor
} }
catch (Exception ex) catch (Exception ex)
{ {
log.LogError(ex, "Failed to run job with ID {jobId}.", context.Job.Id); LogMessages.LogFailedToRunJob(log, context.Job.Id, ex);
await SetStatusAsync(context, JobStatus.Failed); await SetStatusAsync(context, JobStatus.Failed);
} }

92
backend/src/Squidex.Domain.Apps.Entities/LogMessages.cs

@ -0,0 +1,92 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Microsoft.Extensions.Logging;
using Squidex.Infrastructure;
namespace Squidex.Domain.Apps.Entities;
internal static partial class LogMessages
{
[LoggerMessage(Level = LogLevel.Error, Message = "Failed to register user in notifo: {details}.")]
public static partial void LogFailedToRegisterUserInNotifoWithDetails(ILogger logger, string details, Exception exception);
[LoggerMessage(Level = LogLevel.Error, Message = "Failed to register user in notifo.")]
public static partial void LogFailedToRegisterUserInNotifo(ILogger logger, Exception exception);
[LoggerMessage(Level = LogLevel.Error, Message = "Failed to push user to notifo: {details}.")]
public static partial void LogFailedToPushUserToNotifoWithDetails(ILogger logger, string details, Exception exception);
[LoggerMessage(Level = LogLevel.Error, Message = "Failed to push user to notifo.")]
public static partial void LogFailedToPushUserToNotifo(ILogger logger, Exception exception);
[LoggerMessage(Level = LogLevel.Error, Message = "Failed to delete asset recursively.")]
public static partial void LogFailedToDeleteAssetRecursively(ILogger logger, Exception exception);
[LoggerMessage(Level = LogLevel.Information, Message = "Backup with job id {backupId} with from URL '{url}' started.")]
public static partial void LogRestoreJobStarted(ILogger logger, DomainId backupId, Uri url);
[LoggerMessage(Level = LogLevel.Information, Message = "Backup with job id {backupId} from URL '{url}' completed.")]
public static partial void LogRestoreJobCompleted(ILogger logger, DomainId backupId, Uri url);
[LoggerMessage(Level = LogLevel.Error, Message = "Backup with job id {backupId} from URL '{url}' failed.")]
public static partial void LogRestoreJobFailed(ILogger logger, DomainId backupId, Uri url, Exception exception);
[LoggerMessage(Level = LogLevel.Error, Message = "Failed to clean up restore.")]
public static partial void LogFailedToCleanUpRestore(ILogger logger, Exception exception);
[LoggerMessage(Level = LogLevel.Error, Message = "Failed to handle yjs event.")]
public static partial void LogFailedToHandleYjsEvent(ILogger logger, Exception exception);
[LoggerMessage(Level = LogLevel.Warning, Message = "Cannot send email to {email}: No email subject configured for template {template}.")]
public static partial void LogNoEmailSubjectConfigured(ILogger logger, string email, string template);
[LoggerMessage(Level = LogLevel.Warning, Message = "Cannot send email to {email}: No email body configured for template {template}.")]
public static partial void LogNoEmailBodyConfigured(ILogger logger, string email, string template);
[LoggerMessage(Level = LogLevel.Error, Message = "Failed to send notification to {email}.")]
public static partial void LogFailedToSendNotification(ILogger logger, string email, Exception exception);
[LoggerMessage(Level = LogLevel.Error, Message = "Failed to query scheduled status changes-")]
public static partial void LogFailedToQueryScheduledStatusChanges(ILogger logger, Exception exception);
[LoggerMessage(Level = LogLevel.Error, Message = "Failed to execute scheduled status change for content '{contentId}'.")]
public static partial void LogFailedToExecuteScheduledStatusChange(ILogger logger, DomainId contentId, Exception exception);
[LoggerMessage(Level = LogLevel.Error, Message = "Failed to resolve field {field}.")]
public static partial void LogFailedToResolveField(ILogger logger, string field, Exception exception);
[LoggerMessage(Level = LogLevel.Error, Message = "Failed to resolve execute query.")]
public static partial void LogFailedToResolveQuery(ILogger logger, Exception exception);
[LoggerMessage(Level = LogLevel.Warning, Message = "Failed to invite user: Assigner {assignerId} not found.")]
public static partial void LogInvitationAssignerNotFound(ILogger logger, RefToken assignerId);
[LoggerMessage(Level = LogLevel.Warning, Message = "Failed to invite user: Assignee {assigneeId} not found.")]
public static partial void LogInvitationAssigneeNotFound(ILogger logger, string assigneeId);
[LoggerMessage(Level = LogLevel.Warning, Message = "Removed unfinished jobs for owner {ownerId} after start.")]
public static partial void LogRemovedUnfinishedJobs(ILogger logger, DomainId ownerId);
[LoggerMessage(Level = LogLevel.Information, Message = "Clearing jobs for owner {ownerId}.")]
public static partial void LogClearingJobs(ILogger logger, DomainId ownerId);
[LoggerMessage(Level = LogLevel.Information, Message = "Starting new backup with backup id '{backupId}' for owner {ownerId}.")]
public static partial void LogStartingJob(ILogger logger, DomainId backupId, DomainId ownerId);
[LoggerMessage(Level = LogLevel.Error, Message = "Failed to run job with ID {jobId}.")]
public static partial void LogFailedToRunJob(ILogger logger, DomainId jobId, Exception exception);
[LoggerMessage(Level = LogLevel.Information, Message = "Adding rule job for Rule(trigger={ruleTrigger})")]
public static partial void LogAddingRuleJob(ILogger logger, string ruleTrigger);
[LoggerMessage(Level = LogLevel.Warning, Message = "Failed to run rule with ID {ruleId}, continue with next job.")]
public static partial void LogFailedToRunRule(ILogger logger, DomainId? ruleId, Exception exception);
[LoggerMessage(Level = LogLevel.Error, Message = "Failed to execute search from source {source} with query '{query}'.")]
public static partial void LogFailedToExecuteSearch(ILogger logger, string source, string query, Exception exception);
}

6
backend/src/Squidex.Domain.Apps.Entities/Rules/RuleQueueWriter.cs

@ -35,8 +35,10 @@ public sealed class RuleQueueWriter(IFlowManager<FlowEventContext> flowManager,
writes.Add(result.Job.Value); writes.Add(result.Job.Value);
log?.LogInformation("Adding rule job for Rule(trigger={ruleTrigger})", if (log != null)
result.Rule.Trigger.GetType().Name); {
LogMessages.LogAddingRuleJob(log, result.Rule.Trigger.GetType().Name);
}
var today = Clock.GetCurrentInstant().ToDateOnly(); var today = Clock.GetCurrentInstant().ToDateOnly();

6
backend/src/Squidex.Domain.Apps.Entities/Rules/Runner/RuleRunnerJob.cs

@ -171,8 +171,7 @@ public sealed class RuleRunnerJob : IJobRunner
throw result.EnrichmentError; throw result.EnrichmentError;
} }
log.LogWarning(result.EnrichmentError, "Failed to run rule with ID {ruleId}, continue with next job.", LogMessages.LogFailedToRunRule(log, result.Rule?.Id, result.EnrichmentError);
result.Rule?.Id);
} }
} }
} }
@ -212,8 +211,7 @@ public sealed class RuleRunnerJob : IJobRunner
throw result.EnrichmentError; throw result.EnrichmentError;
} }
log.LogWarning(result.EnrichmentError, "Failed to run rule with ID {ruleId}, continue with next job.", LogMessages.LogFailedToRunRule(log, result.Rule?.Id, result.EnrichmentError);
result.Rule?.Id);
} }
} }
} }

2
backend/src/Squidex.Domain.Apps.Entities/Search/SearchManager.cs

@ -37,7 +37,7 @@ public sealed class SearchManager(IEnumerable<ISearchSource> searchSources, ILog
} }
catch (Exception ex) catch (Exception ex)
{ {
log.LogError(ex, "Failed to execute search from source {source} with query '{query}'.", source, query); LogMessages.LogFailedToExecuteSearch(log, source.GetType().Name, query, ex);
return Empty; return Empty;
} }
} }

2
backend/src/Squidex.Domain.Users/DefaultUserService.cs

@ -195,7 +195,7 @@ public sealed class DefaultUserService(
} }
catch (Exception ex2) catch (Exception ex2)
{ {
log.LogError(ex2, "Failed to cleanup user after creation failed."); LogMessages.LogFailedToCleanupUser(log, ex2);
} }
throw; throw;

19
backend/src/Squidex.Domain.Users/LogMessages.cs

@ -0,0 +1,19 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Microsoft.Extensions.Logging;
namespace Squidex.Domain.Users;
internal static partial class LogMessages
{
[LoggerMessage(Level = LogLevel.Error, Message = "Failed to cleanup user after creation failed.")]
public static partial void LogFailedToCleanupUser(ILogger logger, Exception exception);
[LoggerMessage(Level = LogLevel.Error, Message = "Identity operation failed: {errorMessage}.")]
public static partial void LogIdentityOperationFailed(ILogger logger, string errorMessage);
}

2
backend/src/Squidex.Domain.Users/UserManagerExtensions.cs

@ -46,7 +46,7 @@ internal static class UserManagerExtensions
var errorMessage = errorMessageBuilder.ToString(); var errorMessage = errorMessageBuilder.ToString();
log.LogError("Identity operation failed: {errorMessage}.", errorMessage); LogMessages.LogIdentityOperationFailed(log, errorMessage);
throw new ValidationException(result.Errors.Select(x => new ValidationError(Localize(x))).ToList()); throw new ValidationException(result.Errors.Select(x => new ValidationError(Localize(x))).ToList());
} }

6
backend/src/Squidex/Areas/Api/Controllers/Users/UsersController.cs

@ -98,7 +98,7 @@ public sealed class UsersController(
} }
catch (Exception ex) catch (Exception ex)
{ {
log.LogError(ex, "Failed to return users, returning empty results."); LogMessages.LogFailedToReturnUsers(log, ex);
} }
return Ok(Array.Empty<UserDto>()); return Ok(Array.Empty<UserDto>());
@ -129,7 +129,7 @@ public sealed class UsersController(
} }
catch (Exception ex) catch (Exception ex)
{ {
log.LogError(ex, "Failed to return user, returning empty results."); LogMessages.LogFailedToReturnUser(log, ex);
} }
return NotFound(); return NotFound();
@ -202,7 +202,7 @@ public sealed class UsersController(
} }
catch (Exception ex) catch (Exception ex)
{ {
log.LogError(ex, "Failed to return user picture, returning fallback image."); LogMessages.LogFailedToReturnUserPicture(log, ex);
} }
return new FileStreamResult(new MemoryStream(AvatarBytes), "image/png"); return new FileStreamResult(new MemoryStream(AvatarBytes), "image/png");

2
backend/src/Squidex/Areas/IdentityServer/Config/CreateAdminInitializer.cs

@ -84,7 +84,7 @@ public sealed class CreateAdminInitializer(IServiceProvider serviceProvider) : I
{ {
var log = serviceProvider.GetRequiredService<ILogger<CreateAdminInitializer>>(); var log = serviceProvider.GetRequiredService<ILogger<CreateAdminInitializer>>();
log.LogError(ex, "Failed to create administrator."); LogMessages.LogFailedToCreateAdministrator(log, ex);
} }
} }

25
backend/src/Squidex/LogMessages.cs

@ -0,0 +1,25 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Microsoft.Extensions.Logging;
namespace Squidex;
internal static partial class LogMessages
{
[LoggerMessage(Level = LogLevel.Error, Message = "Failed to create administrator.")]
public static partial void LogFailedToCreateAdministrator(ILogger logger, Exception exception);
[LoggerMessage(Level = LogLevel.Error, Message = "Failed to return users, returning empty results.")]
public static partial void LogFailedToReturnUsers(ILogger logger, Exception exception);
[LoggerMessage(Level = LogLevel.Error, Message = "Failed to return user, returning empty results.")]
public static partial void LogFailedToReturnUser(ILogger logger, Exception exception);
[LoggerMessage(Level = LogLevel.Error, Message = "Failed to return user picture, returning fallback image.")]
public static partial void LogFailedToReturnUserPicture(ILogger logger, Exception exception);
}
Loading…
Cancel
Save