Tác giả: Aditya Ranjan
Ngày phát hành: 05 THÁNG 2, 2026
Chuyên mục: .NET, Amazon Bedrock, Amazon CloudWatch
Giới thiệu
Phân tích nhật ký giúp bạn duy trì các ứng dụng đáng tin cậy bằng cách xác định các vấn đề, khắc phục sự cố và thu thập thông tin chi tiết về hoạt động. Phân tích nhật ký truyền thống gặp khó khăn với dữ liệu phi cấu trúc và đòi hỏi hàng giờ làm việc thủ công để trích xuất các mẫu có ý nghĩa. AI tạo sinh (Generative AI) biến đổi quy trình này bằng cách tự động xác định các bất thường, hiểu ngữ cảnh và đưa ra các khuyến nghị cụ thể mà không cần cấu hình phức tạp.
Trong bài đăng này, tôi sẽ chỉ cho bạn cách xây dựng một hệ thống phân tích nhật ký dựa trên .NET sử dụng Amazon Bedrock. Bạn sẽ kết hợp .NET với mô hình nền tảng Claude 3.5 Sonnet của Anthropic có sẵn trong Amazon Bedrock để tạo ra một giải pháp vượt xa việc lưu trữ và trực quan hóa nhật ký, mang lại khả năng phát hiện mẫu được hỗ trợ bởi AI.
Tổng quan giải pháp
Giải pháp này trình bày một kiến trúc serverless và tích hợp một ứng dụng .NET với Amazon CloudWatch Logs để lưu trữ và quản lý nhật ký tập trung. Giải pháp kết hợp với khả năng xử lý ngôn ngữ tự nhiên của các foundation model trong Amazon Bedrock. Cách tiếp cận này diễn giải dữ liệu nhật ký mà không cần viết các quy tắc truy vấn tùy chỉnh hoặc logic khớp mẫu để cấu hình quy tắc.
Sơ đồ kiến trúc được hiển thị trong Hình 1 minh họa cách giải pháp hoạt động.
- Tạo nhật ký: Ứng dụng Log Generator .NET tạo các nhật ký ứng dụng mô phỏng và ghi chúng vào Amazon CloudWatch cứ sau 15 giây.
- Truy xuất nhật ký: Ứng dụng Log Analyzer .NET truy vấn Amazon CloudWatch cứ sau 30 giây để truy xuất nhật ký từ một khoảng thời gian có thể cấu hình (mặc định: 5 phút).
- Phân tích AI: Log Analyzer gửi các nhật ký đã truy xuất đến Amazon Bedrock, nơi định tuyến chúng đến Claude Sonnet 3.5 để phân tích thông minh.
- Cung cấp thông tin chi tiết: Mô hình Claude Sonnet 3.5 phân tích nhật ký để tìm các mẫu, bất thường, vấn đề hiệu suất và hành vi người dùng, sau đó trả về các thông tin chi tiết và khuyến nghị có thể hành động cho Log Analyzer, hiển thị chúng cho người dùng.
Chu trình này lặp lại liên tục, cung cấp thông tin tình báo hoạt động gần như thời gian thực mà không cần cấu hình quy tắc thủ công.

Hình 1: Kiến trúc giải pháp
Trong các phần sau, tôi sẽ đi sâu vào chi tiết triển khai của từng thành phần, chỉ cho bạn cách xây dựng hệ thống này từng bước.
Điều kiện tiên quyết
Để triển khai giải pháp này, hãy đảm bảo bạn có những điều sau:
- Một tài khoản AWS có quyền truy cập Amazon Bedrock.
- Bật quyền truy cập vào mô hình Claude 3.5 Sonnet trong Amazon Bedrock. Làm theo hướng dẫn: Truy cập các foundation model của Amazon Bedrock.
- Quyền AWS Identity and Access Management cho Amazon Bedrock và cho Amazon CloudWatch.
- AWS CLI đã được cài đặt và cấu hình trên máy của bạn.
- .NET 8 SDK đã được cài đặt trên máy phát triển của bạn.
- Một trình soạn thảo mã (Visual Studio hoặc Visual Studio Code với tiện ích mở rộng C#).
Phân tích nhật ký được hỗ trợ bởi AI với Amazon Bedrock
Cốt lõi trí tuệ của hệ thống này nằm ở việc tích hợp với Amazon Bedrock. Sau khi truy xuất nhật ký từ Amazon CloudWatch, trình phân tích nhật ký sẽ gửi dữ liệu đến mô hình nền tảng Claude 3.5 Sonnet của Anthropic có sẵn trong Amazon Bedrock.
Mô hình ngôn ngữ lớn tiên tiến này xử lý dữ liệu nhật ký để:
- Xác định các mẫu và xu hướng trên nhiều mục nhật ký, trong một cửa sổ cuộn 5 phút có thể cấu hình.
- Phát hiện các bất thường hoặc hành vi hệ thống bất thường.
- Tạo các bản tóm tắt hoạt động nhật ký dễ đọc.
- Đề xuất các nguyên nhân gốc rễ tiềm ẩn cho lỗi hoặc vấn đề hiệu suất.
Phân tích mô hình nền tảng của Amazon Bedrock sau đó được ứng dụng .NET Analyzer xử lý để trình bày các thông tin chi tiết có thể hành động cho người dùng.
Lưu ý: Giải pháp này sử dụng Claude 3.5 Sonnet, có thể được gọi trực tiếp bằng ID mô hình của nó. Đối với các foundation model mới hơn (Claude 4 trở lên), Amazon Bedrock yêu cầu tạo và sử dụng một inference profile trong lời gọi mô hình, một tài nguyên định nghĩa mô hình và các Region để định tuyến yêu cầu. Bạn có thể tạo các inference profile ứng dụng bằng AWS CLI hoặc SDK. Để biết hướng dẫn chi tiết, hãy tham khảo Thiết lập tài nguyên lời gọi mô hình bằng inference profiles.
Cách giải pháp này khác với CloudWatch Logs Insights
Trong khi CloudWatch Logs Insights cung cấp khả năng truy vấn mạnh mẽ để tìm kiếm và tổng hợp dữ liệu nhật ký bằng cú pháp giống SQL, giải pháp này bổ sung một lớp diễn giải được hỗ trợ bởi AI. CloudWatch Logs Insights yêu cầu bạn phải biết các mẫu cần tìm kiếm và viết các truy vấn cụ thể, trong khi giải pháp này sử dụng Amazon Bedrock để khám phá các bất thường, tương quan các sự kiện và cung cấp thông tin chi tiết bằng ngôn ngữ tự nhiên mà không cần các truy vấn được xác định trước, giúp thông tin tình báo hoạt động dễ tiếp cận mà không cần chuyên môn về truy vấn.
Các thành phần chính
Dưới đây là các thành phần chính được sử dụng trong giải pháp này.
- Log Generator (.NET Console App)
Ứng dụng tạo nhật ký tạo các nhật ký ứng dụng mẫu và lưu trữ chúng trong Amazon CloudWatch. Ứng dụng mô phỏng hoạt động của người dùng trên một ứng dụng web với các sự kiện ngẫu nhiên. Chức năng cốt lõi sử dụng AWS SDK for .NET để ghi các mục nhật ký có cấu trúc. Trình tạo nhật ký tạo các mục nhật ký mới cứ sau 15 giây, cung cấp một luồng dữ liệu ổn định để trình phân tích xử lý. Trình tạo triển khai một lớpCloudWatchLoggertùy chỉnh tích hợp với giao diệnILoggertiêu chuẩn của .NET. Nó cấu trúc các mục nhật ký dưới dạng đối tượng JSON với thông tin dấu thời gian, cấp độ nhật ký và thông báo, tự động sắp xếp chúng vào các log stream của CloudWatch dựa trên tên máy và ngày (log-stream-{MachineName}-{YYYYMMDD}). Ứng dụng tạo ra một phân phối thực tế của các cấp độ nhật ký, 90% thông tin với 8% cảnh báo và 2% lỗi, mô phỏng hành vi ứng dụng web điển hình. Tệp dự án hoàn chỉnh (Program.cs for LogGenerator) với tất cả các phụ thuộc được cung cấp trong phần Triển khai sau này trong bài đăng này. - Amazon CloudWatch Logs
Amazon CloudWatch Logs đóng vai trò là kho lưu trữ nhật ký tập trung. Giải pháp sử dụng khả năng lọc dựa trên thời gian gốc của CloudWatch thông qua API FilterLogEvents để truy xuất nhật ký trong các phạm vi thời gian cụ thể. Các mục nhật ký được tự động sắp xếp vào các log stream (log-stream-{MachineName}-{YYYYMMDD}), cho phép truy vấn hiệu quả dữ liệu gần đây, thường là phù hợp nhất cho các kịch bản phân tích nhật ký. - Log Analyzer (.NET Console App)
Ứng dụng phân tích nhật ký tạo thành lớp thông minh của giải pháp này, định kỳ truy vấn Amazon CloudWatch Logs để tìm các mục gần đây và gửi chúng đến Amazon Bedrock để phân tích. Nó triển khai một vòng lặp giám sát liên tục kiểm tra các nhật ký mới cứ sau 30 giây, với một cửa sổ thời gian có thể cấu hình (mặc định 5 phút) để đảm bảo phân tích vẫn phù hợp với hành vi hệ thống hiện tại. Ứng dụng chấp nhận các lời nhắc phân tích tùy chỉnh thông qua các đối số dòng lệnh, cho phép các nhóm tập trung vào các mối quan tâm hoạt động cụ thể như mối đe dọa bảo mật, tắc nghẽn hiệu suất hoặc các chỉ số kinh doanh mà không cần sửa đổi mã. Ứng dụng truy xuất nhật ký bằng APIFilterLogEventscủa CloudWatch trong phạm vi thời gian đã chỉ định, sau đó xây dựng các lời nhắc được định dạng cẩn thận cho mô hình Claude 3.5 Sonnet với dữ liệu nhật ký đã được tuần tự hóa, cấu hình các tham số nhiệt độ và token để cân bằng độ sâu phân tích với thời gian phản hồi. Trình phân tích xử lý toàn bộ quy trình từ truy xuất dữ liệu đến trình bày thông tin chi tiết, quản lý giao tiếp không đồng bộ với cả dịch vụ Amazon CloudWatch Logs và Amazon Bedrock. Nó bao gồm khả năng xử lý lỗi mạnh mẽ để đảm bảo hoạt động liên tục ngay cả khi gặp sự cố dịch vụ hoặc định dạng dữ liệu không mong muốn, làm cho nó phù hợp cho các kịch bản giám sát sản xuất. Tệp dự án hoàn chỉnh (Program.cs for LogAnalyzer) với tất cả các phụ thuộc được cung cấp trong phần Triển khai sau này trong bài đăng này. - Amazon Bedrock
Amazon Bedrock cung cấp quyền truy cập serverless vào Claude và các foundation model khác. Giải pháp này sử dụng khả năng mô hình ngôn ngữ lớn (LLM) để phân tích dữ liệu nhật ký có cấu trúc, xác định các mẫu, bất thường và các vấn đề tiềm ẩn. Amazon Bedrock xử lý các yêu cầu tính toán của xử lý ngôn ngữ tự nhiên và cung cấp một giao diện API đơn giản, thống nhất thông qua Amazon Bedrock Runtime, tích hợp với ứng dụng .NET bằng AWS SDK for .NET (góiAWSSDK.BedrockRuntimevàAmazonBedrockRuntimeClient).
Triển khai
Đối với bài đăng trên blog này, bạn sẽ chạy cả trình tạo nhật ký và trình phân tích nhật ký trên máy phát triển của mình để nhanh chóng thiết lập và kiểm tra hệ thống. Đối với các triển khai sản xuất, bạn sẽ cần giải quyết vấn đề khả năng mở rộng, tính khả dụng và giám sát, nhưng các nguyên tắc triển khai bạn sẽ học ở đây áp dụng trực tiếp cho môi trường sản xuất.
Bước 1: Tạo CloudWatch Log Group:
Để lưu trữ dữ liệu nhật ký, hãy tạo một CloudWatch Log Group bằng lệnh AWS CLI sau.
aws logs create-log-group \--log-group-name ApplicationLogs \--region us-east-1
Log group sẽ chứa các log stream được tự động sắp xếp theo tên máy và ngày, theo mẫu log-stream-{MachineName}-{YYYYMMDD}.
Bước 2: Phát triển Log Generator
Tạo một ứng dụng console .NET để mô phỏng việc tạo dữ liệu nhật ký.
- Đầu tiên, tạo một ứng dụng console .NET mới. Chạy lệnh sau:
dotnet new console -n LogGenerator cd LogGenerator - Thêm các gói NuGet cần thiết:
dotnet add package AWSSDK.CloudWatchLogs dotnet add package Microsoft.Extensions.Logging - Thay thế
Program.csbằng mã sau:(Program.cs cho LogGenerator) using Amazon.CloudWatchLogs; using Amazon.CloudWatchLogs.Model; using Microsoft.Extensions.Logging; using System.Text.Json; class Program { static async Task Main(string[] args) { var cloudWatchClient = new AmazonCloudWatchLogsClient(); var logger = new CloudWatchLogger(cloudWatchClient, "ApplicationLogs"); Console.WriteLine("Log Generator started. Generating logs every 15 seconds..."); var random = new Random(); string[] users = { "user1", "user2", "user3", "user4", "user5" }; string[] actions = { "login", "logout", "view_page", "update_profile", "make_purchase" }; string[] pages = { "home", "products", "profile", "cart", "checkout" }; while (true) { var logLevel = GetRandomLogLevel(random); var user = users[random.Next(users.Length)]; var action = actions[random.Next(actions.Length)]; var page = pages[random.Next(pages.Length)]; var duration = random.Next(10, 5000); var message = $"User '{user}' performed action '{action}' on page '{page}'. Duration: {duration}ms"; await logger.LogAsync(logLevel, message); Console.WriteLine($"[{DateTimeOffset.UtcNow}] {logLevel}: {message}"); await Task.Delay(15000); // Wait for 15 seconds } } static LogLevel GetRandomLogLevel(Random random) { var levels = new[] { LogLevel.Information, LogLevel.Information, LogLevel.Information, LogLevel.Warning, LogLevel.Error }; return levels[random.Next(levels.Length)]; }} public class CloudWatchLogger : ILogger { private readonly AmazonCloudWatchLogsClient _cloudWatchClient; private readonly string _logGroupName; private readonly string _logStreamName;public CloudWatchLogger(AmazonCloudWatchLogsClient cloudWatchClient, string logGroupName) { _cloudWatchClient = cloudWatchClient; _logGroupName = logGroupName; _logStreamName = $"log-stream-{Environment.MachineName}-{DateTimeOffset.UtcNow:yyyyMMdd}"; // Ensure log stream exists EnsureLogStreamExists().Wait(); } private async Task EnsureLogStreamExists() { try { await _cloudWatchClient.CreateLogStreamAsync(new CreateLogStreamRequest { LogGroupName = _logGroupName, LogStreamName = _logStreamName }); } catch (ResourceAlreadyExistsException) { // Log stream already exists, which is fine } } void ILogger.Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter) { var logEntry = new { Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), LogLevel = logLevel.ToString(), Message = formatter(state, exception) }; var logMessage = JsonSerializer.Serialize(logEntry); var putLogEventsRequest = new PutLogEventsRequest { LogGroupName = _logGroupName, LogStreamName = _logStreamName, LogEvents = new List<InputLogEvent> { new InputLogEvent { Timestamp = DateTime.UtcNow, Message = logMessage } } }; _cloudWatchClient.PutLogEventsAsync(putLogEventsRequest); } public async Task LogAsync(LogLevel logLevel, string message) { ((ILogger)this).Log(logLevel, 0, message, null, (state, _) => state); } public bool IsEnabled(LogLevel logLevel) => true; IDisposable? ILogger.BeginScope<TState>(TState state) => null;}
Bước 3: Xây dựng Log Analyzer
Ứng dụng phân tích nhật ký sẽ truy xuất nhật ký từ Amazon CloudWatch Logs và sử dụng Amazon Bedrock để phân tích chúng.
- Tạo một ứng dụng console .NET khác. Chạy lệnh sau:
dotnet new console -n LogAnalyzer cd LogAnalyzer - Thêm các gói cần thiết:
dotnet add package AWSSDK.CloudWatchLogs dotnet add package AWSSDK.BedrockRuntime - Thay thế
Program.csbằng mã sau: (Program.cscho LogAnalyzer)using Amazon.BedrockRuntime; using Amazon.BedrockRuntime.Model; using Amazon.CloudWatchLogs; using Amazon.CloudWatchLogs.Model; using System.Text.Json; class Program { static async Task Main(string[] args) { var cloudWatchClient = new AmazonCloudWatchLogsClient(); var bedrockClient = new AmazonBedrockRuntimeClient(); // Parse command-line arguments string customPrompt = args.Length > 0 && !string.IsNullOrWhiteSpace(args[0]) ? args[0] : "Analyze these logs for anomalies and patterns. Focus on:\n" + "1. Temporal patterns and timing anomalies\n" + "2. User behavior and activity patterns\n" + "3. Performance metrics and bottlenecks\n" + "4. Error correlation with performance issues\n" + "5. System health indicators and recommendations"; int timeWindowMinutes = 5; // Default 5 minutes if (args.Length > 1 && int.TryParse(args[1], out int parsedMinutes) && parsedMinutes > 0) { timeWindowMinutes = parsedMinutes; } Console.WriteLine("Log Analyzer started..."); Console.WriteLine($"Analysis Prompt: {(args.Length > 0 && !string.IsNullOrWhiteSpace(args[0]) ? "Custom" : "Default")}"); Console.WriteLine($"Time Window: {timeWindowMinutes} minutes"); Console.WriteLine(); while (true) { try { Console.WriteLine($"\nChecking for logs at {DateTimeOffset.UtcNow}..."); var logs = await GetRecentLogs(cloudWatchClient, "ApplicationLogs", timeWindowMinutes); Console.WriteLine($"Found {logs.Count} logs"); if (logs.Count > 0) { Console.WriteLine("Analyzing logs with Bedrock..."); var analysis = await AnalyzeLogs(bedrockClient, logs, customPrompt); Console.WriteLine("\nAnalysis Result:"); Console.WriteLine(analysis); } else { Console.WriteLine($"No logs found in the last {timeWindowMinutes} minutes."); } } catch (Exception ex) { Console.WriteLine($"Error: {ex.Message}"); } Console.WriteLine("\nWaiting 30 seconds before next check..."); await Task.Delay(TimeSpan.FromSeconds(30)); } } static async Task<List<Dictionary<string, object>>> GetRecentLogs(AmazonCloudWatchLogsClient client, string logGroupName, int timeWindowMinutes) { var now = DateTimeOffset.UtcNow; var timeAgo = now.AddMinutes(-timeWindowMinutes); var request = new FilterLogEventsRequest { LogGroupName = logGroupName, StartTime = timeAgo.ToUnixTimeMilliseconds(), EndTime = now.ToUnixTimeMilliseconds() }; var response = await client.FilterLogEventsAsync(request); var logs = new List<Dictionary<string, object>>(); foreach (var logEvent in response.Events) { try { // Parse the JSON message back to structured data var logData = JsonSerializer.Deserialize<Dictionary<string, object>>(logEvent.Message); if (logData != null) { logs.Add(logData); } } catch (JsonException) { // If JSON parsing fails, create a simple structure logs.Add(new Dictionary<string, object> { ["Timestamp"] = logEvent.Timestamp ?? DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), ["Message"] = logEvent.Message, ["LogLevel"] = "Information" }); } } return logs; } static async Task<string> AnalyzeLogs(AmazonBedrockRuntimeClient client, List<Dictionary<string, object>> logs, string analysisPrompt) { // Convert logs to a readable format for Claude var jsonOptions = new JsonSerializerOptions { WriteIndented = true }; string logsContent = JsonSerializer.Serialize(logs, jsonOptions); var requestBody = new { anthropic_version = "bedrock-2023-05-31", max_tokens = 500, messages = new[] { new { role = "user", content = new[] { new { type = "text", text = $"{analysisPrompt}:\n\nLog Data:\n{logsContent}" } } } } }; var request = new InvokeModelRequest { ModelId = "anthropic.claude-3-5-sonnet-20240620-v1:0", ContentType = "application/json", Accept = "application/json", Body = new MemoryStream(JsonSerializer.SerializeToUtf8Bytes(requestBody)) }; try { var response = await client.InvokeModelAsync(request); using var reader = new StreamReader(response.Body); var responseJson = await reader.ReadToEndAsync(); var responseObj = JsonSerializer.Deserialize<Dictionary<string, JsonElement>>(responseJson); if (responseObj is null) { return "Failed to deserialize Bedrock response."; } if (!responseObj.TryGetValue("content", out var content)) { return "No 'content' field found in response."; } if (content.GetArrayLength() == 0) { return "Content array is empty."; } var firstContent = content[0]; if (!firstContent.TryGetProperty("text", out var text)) { return "No 'text' property found in content."; } return text.GetString() ?? "No text content found"; } catch (Exception ex) { return $"Error calling Bedrock: {ex.Message}"; } }}
Bước 4: Kiểm tra hệ thống
Để xác thực chức năng của hệ thống phân tích nhật ký này, bạn cần chạy trình tạo nhật ký để điền dữ liệu mẫu vào CloudWatch log group. Sau đó, thực thi trình phân tích nhật ký để kiểm tra kết quả, thể hiện những thông tin chi tiết được cung cấp bởi sự tích hợp của .NET và Amazon Bedrock.
Chạy cả hai ứng dụng trong các cửa sổ terminal riêng biệt:
- Mở terminal và chạy các lệnh sau để khởi động Log Generator:
cd LogGenerator dotnet runĐầu ra dự kiến:Log Generator started. Generating logs every 15 seconds... [1/6/2026 9:24:36 AM +00:00] Error: User 'user2' performed action 'view_page' on page 'products'. Duration: 911ms [1/6/2026 9:24:51 AM +00:00] Information: User 'user4' performed action 'view_page' on page 'home'. Duration: 1647ms [1/6/2026 9:25:06 AM +00:00] Information: User 'user3' performed action 'make_purchase' on page 'products'. Duration: 2244ms - Mở một terminal khác để khởi động Log Analyzer:
cd LogAnalyzer dotnet run# Optional: Use custom prompt and time window # dotnet run "Focus on security threats and unauthorized access" 10 # Custom prompt with 15-minute window< # dotnet run "" 15 # Default prompt with 15-minute windowĐầu ra dự kiến:Log Analyzer started... Analysis Prompt: Default Time Window: 5 minutes Checking for logs at 1/14/2026 8:29:22 AM +00:00... Found 19 logs Analyzing logs with Bedrock... Analysis Result: Based on the provided log data, here's an analysis focusing on the requested aspects: 1. Temporal patterns and timing anomalies: - The logs span approximately 4.5 minutes, with entries occurring roughly every 15 seconds. - There are no significant timing anomalies in terms of log entry frequency. 2. User behavior and activity patterns: - Five unique users (user1 to user5) are observed in the logs. - user3 appears most frequently (5 times), followed by user2 and user5 (4 times each). - The most common actions are "view_page" (7 times) and "update_profile" (4 times). - Some unusual patterns: - user1 makes two purchases on different pages (home and profile). - user2 logs out but later performs actions, suggesting a possible session issue. 3. Performance metrics and bottlenecks: - Average duration across all actions: 2157.8ms - Longest duration: 4644ms (user2 viewing cart page) - Shortest duration: 319ms (user5 making a purchase on checkout page) - Potential bottlenecks: - Cart page: 4644ms for viewing (user2) - Checkout page: 3826ms for viewing (user5) 4. Error correlation with performance issues: - 5 error logs are present, with an average duration of 2066.2ms - 3 out of 5 errors have durations higher than the overall average, suggesting a correlation between errors and slower performance - Notable error: user3's purchase attempt on the cart page took 3261ms and resulted in an error 5. System health indicators and recommendations: - The system appears to be functioning, but with some concerning patterns: a. High variation in response times (319ms to 4644ms) b. Frequent errors (25% of logs are errors) c. Some pages (cart, checkout) show consistently slower performance Recommendations: 1. Investigate and optimize the cart and checkout pages to improve performance. 2. Look into the cause of frequent Waiting 30 seconds before next check...
Các điểm chính cần lưu ý
- Log Generator liên tục tạo các mục nhật ký thực tế (sau mỗi 15 giây).
- Log Analyzer định kỳ kiểm tra các nhật ký mới (sau mỗi 30 giây).
- Khi tìm thấy nhật ký, chúng sẽ được gửi đến Amazon Bedrock để phân tích.
- Kết quả phân tích cung cấp thông tin chi tiết về hành vi người dùng, hiệu suất hệ thống và các vấn đề tiềm ẩn.
Thiết lập này thể hiện quy trình làm việc hoàn chỉnh từ tạo nhật ký đến phân tích được hỗ trợ bởi AI, cho thấy cách các ứng dụng .NET có thể tích hợp hiệu quả với Amazon Bedrock để phân tích nhật ký được hỗ trợ bởi AI.
Phân tích chi phí
Dưới đây là chi phí ước tính để chạy giải pháp phân tích nhật ký này trong Region us-east-1, dựa trên mức sử dụng giả định. Luôn kiểm tra trang định giá Amazon Bedrock để biết giá hiện tại.
Kịch bản mẫu: Một ứng dụng điển hình tạo 100.000 mục nhật ký mỗi tháng, với mỗi mục nhật ký chứa khoảng 100 ký tự (dấu thời gian, cấp độ nhật ký, hành động người dùng, thời lượng). Hệ thống phân tích nhật ký cứ sau 30 giây, kiểm tra một cửa sổ cuộn 5 phút của các nhật ký gần đây.
| Thành phần chi phí | Chi tiết | Tính toán | Chi phí hàng tháng |
|---|---|---|---|
| CloudWatch Logs | |||
| Data Ingestion | 10 MB với $0.50/GB | 0.01 GB × $0.50 | $0.01 |
| Data Storage | 10 MB với $0.03/GB/tháng | 0.01 GB × $0.03 | $0.00 |
| Amazon Bedrock (Claude 3.5 Sonnet) | |||
| Input Tokens | ~25.3M tokens với $3/1M tokens | 25.3 × $3 | $75.82 |
| Output Tokens | ~1.4M tokens với $15/1M tokens | 1.4 × $15 | $21.60 |
| Tổng chi phí hàng tháng | $97.43 |
Xử lý giới hạn Token trong các kịch bản khối lượng lớn
Claude 3.5 Sonnet (anthropic.claude-3-5-sonnet-20240620-v1:0) hỗ trợ tới 200.000 input token và 4.096 output token. Mặc dù cửa sổ nhật ký 5 phút hoạt động tốt cho các ứng dụng điển hình, nhưng môi trường sản xuất có lưu lượng truy cập cao có thể tạo ra khối lượng nhật ký vượt quá các giới hạn này.
Để giải quyết các kịch bản khối lượng lớn, hãy tham khảo các phương pháp giảm thiểu sau:
- Lọc theo mức độ nghiêm trọng: Sử dụng các mẫu lọc của CloudWatch để chỉ phân tích nhật ký Lỗi và Cảnh báo.
- Bảo vệ giới hạn token: Ước tính số lượng token và cắt bớt các nhật ký gần đây nhất nếu gần đạt giới hạn 200K.
- Lấy mẫu: Đối với khối lượng cực lớn, hãy phân tích một mẫu đại diện thay vì tất cả các nhật ký.
- Ưu tiên: Sắp xếp nhật ký theo mức độ nghiêm trọng và độ mới, giữ lại các mục quan trọng nhất.
Dọn dẹp tài nguyên
Làm theo các bước sau để dọn dẹp các tài nguyên đã tạo:
- Xóa CloudWatch log group:
aws logs delete-log-group --log-group-name ApplicationLogs - Dừng các ứng dụng đang chạy: Chấm dứt các ứng dụng LogGenerator và LogAnalyzer bằng cách nhấn
Ctrl+Ctrong các cửa sổ terminal tương ứng của chúng. - Xóa các tệp dự án cục bộ:
rm -rf ~/Desktop/blogdotnet/LogAnalyzer rm -rf ~/Desktop/blogdotnet/LogGenerator - Kiểm tra xem CloudWatch log group đã bị xóa chưa:
aws logs describe-log-groups
Kết luận
Trong bài đăng trên blog này, tôi đã trình bày cách xây dựng một hệ thống phân tích nhật ký dựa trên .NET tận dụng sức mạnh của các foundation model có sẵn trong Amazon Bedrock. Bằng cách kết hợp thế mạnh của phát triển .NET và Amazon Bedrock, chúng tôi đã tạo ra một giải pháp có thể biến nhật ký ứng dụng của bạn thành những thông tin chi tiết có giá trị, có thể hành động. Khi bạn tiếp tục làm việc với .NET và khám phá các khả năng của dịch vụ AWS, hãy xem xét cách bạn có thể tích hợp các công nghệ này để giải quyết các thách thức trong thế giới thực của mình.
Để khám phá thêm, hãy xem các tài nguyên bổ sung này:
Về tác giả

Aditya Ranjan
Aditya Ranjan là Chuyên gia tư vấn chính tại Amazon Web Services. Anh ấy giúp khách hàng thiết kế và triển khai các giải pháp kỹ thuật được kiến trúc tốt bằng cách sử dụng các công nghệ mới nhất của AWS, bao gồm các dịch vụ AI tạo sinh, giúp họ đạt được các mục tiêu kinh doanh.