首页 > 编程语言 >【社招+校招】华为OD机试 - 运维日志排序(Java & JS & Python & C)

【社招+校招】华为OD机试 - 运维日志排序(Java & JS & Python & C)

时间:2024-07-04 12:30:41浏览次数:27  
标签:10 00 社招 Java logs 运维 timestamp 2023 04

鱼弦:公众号【红尘灯塔】,CSDN博客专家、内容合伙人、新星导师、全栈领域优质创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)

运维日志排序算法实现(Java、JavaScript、Python、C、C++)

算法概述

运维日志通常包含时间戳、事件信息和其他详细信息,这些信息可能来自不同的系统或应用程序。为了方便分析和排查问题,需要对日志进行排序,使其按照时间顺序排列。

常用的运维日志排序算法包括:

  1. 时间戳排序: 最简单的排序方法是根据日志时间戳进行排序。可以将日志记录转换为时间戳,然后使用标准的排序算法(如快速排序、归并排序)进行排序。

  2. 多字段排序: 对于包含多个时间戳或其他时间信息的日志,可以使用多字段排序算法。例如,可以先按第一个时间戳排序,然后在相同时间戳的情况下按第二个时间戳排序,以此类推。

  3. 自定义比较器排序: 如果日志记录的格式不标准或包含非时间戳信息,可以使用自定义比较器进行排序。比较器函数需要根据需要比较的字段定义排序规则。

代码实现

Java

import java.util.*;

public class LogSorter {

    public static List<String> sortLogs(List<String> logs) {
        Collections.sort(logs, new Comparator<String>() {
            @Override
            public int compare(String log1, String log2) {
                // Parse timestamps from log lines
                String timestamp1 = extractTimestamp(log1);
                String timestamp2 = extractTimestamp(log2);

                // Compare timestamps using a natural sorting order
                return timestamp1.compareTo(timestamp2);
            }

            private String extractTimestamp(String log) {
                // Extract timestamp from log line based on specific format
                // Replace with actual timestamp extraction logic
                return log.substring(0, 10); // Assuming timestamp is at the beginning
            }
        });
        return logs;
    }

    public static void main(String[] args) {
        List<String> logs = new ArrayList<>();
        logs.add("[2023-10-04 10:20:30] Error: Database connection failed");
        logs.add("[2023-10-04 10:15:25] Info: User login successful");
        logs.add("[2023-10-04 10:30:00] Warning: Server load is high");

        List<String> sortedLogs = sortLogs(logs);
        for (String log : sortedLogs) {
            System.out.println(log);
        }
    }
}

JavaScript

function sortLogs(logs) {
    logs.sort((log1, log2) => {
        // Parse timestamps from log lines
        const timestamp1 = extractTimestamp(log1);
        const timestamp2 = extractTimestamp(log2);

        // Compare timestamps using natural sorting order
        return timestamp1.localeCompare(timestamp2);
    });
    return logs;
}

function extractTimestamp(log) {
    // Extract timestamp from log line based on specific format
    // Replace with actual timestamp extraction logic
    return log.substring(0, 10); // Assuming timestamp is at the beginning
}

const logs = [
    "[2023-10-04 10:20:30] Error: Database connection failed",
    "[2023-10-04 10:15:25] Info: User login successful",
    "[2023-10-04 10:30:00] Warning: Server load is high",
];

const sortedLogs = sortLogs(logs);
console.log(sortedLogs);

Python

def sort_logs(logs):
    logs.sort(key=lambda log: extract_timestamp(log))
    return logs

def extract_timestamp(log):
    # Extract timestamp from log line based on specific format
    # Replace with actual timestamp extraction logic
    return log[:10]  # Assuming timestamp is at the beginning

logs = [
    "[2023-10-04 10:20:30] Error: Database connection failed",
    "[2023-10-04 10:15:25] Info: User login successful",
    "[2023-10-04 10:30:00] Warning: Server load is high",
    "[2023-10-05 12:00:00] Critical: System overload detected",
    "[2023-10-04 11:00:00] Debug: Application started",
]

sorted_logs = sort_logs(logs)
print(sorted_logs)

C语言

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct LogEntry {
    char timestamp[20];
    char message[1024];
} LogEntry;

int compareLogs(const void *a, const void *b) {
    LogEntry *log1 = (LogEntry *)a;
    LogEntry *log2 = (LogEntry *)b;

    // Compare timestamps using string comparison
    return strcmp(log1->timestamp, log2->timestamp);
}

void sortLogs(LogEntry logs[], int numLogs) {
    qsort(logs, numLogs, sizeof(LogEntry), compareLogs);
}

void printLogs(LogEntry logs[], int numLogs) {
    for (int i = 0; i < numLogs; i++) {
        printf("[%s] %s\n", logs[i].timestamp, logs[i].message);
    }
}

int main() {
    LogEntry logs[] = {
        {"2023-10-04 10:20:30", "Error: Database connection failed"},
        {"2023-10-04 10:15:25", "Info: User login successful"},
        {"2023-10-04 10:30:00", "Warning: Server load is high"},
        {"2023-10-05 12:00:00", "Critical: System overload detected"},
        {"2023-10-04 11:00:00", "Debug: Application started"},
    };
    int numLogs = sizeof(logs) / sizeof(LogEntry);

    sortLogs(logs, numLogs);
    printLogs(logs, numLogs);

    return 0;
}

C++实现

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

using namespace std;

struct LogEntry {
    string timestamp;
    string message;
};

bool compareLogs(const LogEntry& log1, const LogEntry& log2) {
    return log1.timestamp < log2.timestamp;
}

vector<LogEntry> sortLogs(vector<LogEntry> logs) {
    sort(logs.begin(), logs.end(), compareLogs);
    return logs;
}

void printLogs(const vector<LogEntry>& logs) {
    for (const LogEntry& log : logs) {
        cout << "[" << log.timestamp << "] " << log.message << endl;
    }
}

int main() {
    vector<LogEntry> logs = {
        {"2023-10-04 10:20:30", "Error: Database connection failed"},
        {"2023-10-04 10:15:25", "Info: User login successful"},
        {"2023-10-04 10:30:00", "Warning: Server load is high"},
        {"2023-10-05 12:00:00", "Critical: System overload detected"},
        {"2023-10-04 11:00:00", "Debug: Application started"},
    };

    vector<LogEntry> sortedLogs = sortLogs(logs);
    printLogs(sortedLogs);

    return 0;
}

部署测试搭建实现(中文解释)

部署

  1. 保存代码:

    • 将提供的 C 或 C++ 代码分别保存为 sort_logs.csort_logs.cpp 文件。
  2. 编译:

    • 打开终端或命令提示符并导航到保存代码的目录。
    • 对于 C 代码,使用以下命令进行编译:

gcc sort_logs.c -o sort_logs

  • 对于 C++ 代码,使用以下命令进行编译:

g++ sort_logs.cpp -o sort_logs

这将生成名为 sort_logs 的可执行文件。

测试

  1. 执行可执行文件:
    • 打开终端或命令提示符并导航到可执行文件所在的目录。
    • 运行以下命令执行可执行文件

标签:10,00,社招,Java,logs,运维,timestamp,2023,04
From: https://blog.csdn.net/feng1790291543/article/details/140087025

相关文章

  • 【校招+社招】华为OD机试 - 统计射击比赛成绩(Java & JS & Python)
    鱼弦:公众号【红尘灯塔】,CSDN博客专家、内容合伙人、新星导师、全栈领域优质创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)统计射击比赛成绩(Java、JavaScript、Python和C++)算法实现问题描述:在一......
  • 【java开发环境】多版本jdk 自由切换window和linux
    win10一、准备各种版本的jdk,按自己的需要下载。我这里是需要jdk17和jdk8。1、jdk17下载:JavaDownloads|Oracle,选择exe后缀文件2、jdk8下载:JavaDownloads|Oracle,选择exe后缀文件二、详细步骤1、安装jdk很简单,双击exe文件后全部默认下一步即可,安装的时候记住安装......
  • JAVA每日作业day7.1-7.3小总结
    ok了家人们前几天学了一些知识,接下来一起看看吧一.APIJava的API(API:Application(应用)Programming(程序) Interface(接口))JavaAPI就是JDK中提供给我们使用的类,这些类将底层的代码实现封装了起来,我们不需要关心这些类是如何......
  • JAVA多线程快速入门
    什么是多线程概述线程线程是操作系统能够进行运算调度的最小单位它被包含在进程之中,是进程中的实际运作单位简单理解应用软件中互相独立,可以同时运行的功能进程进程是程序的基本执行实体/系统分配资源的基本单位作用充分利用cpu提......
  • [java]windows下jdk安装包所有版本系列下载地址汇总国内源下载
    jdk1.8及其以前版本可以参考[java]windows和linux下jdk1.8安装包所有版本系列下载地址汇总,这里只发布jdk9及其以后最新版本。注意下面均为windowsx64版本安装包exe格式序号java版本下载地址1jdk-22.0.1-windows-x64-bin.exe点我下载2jdk-21.0.3-windows-x64-bin.exe点我下......
  • Java多线程编程
    1.进程进程是指操作系统中正在运行的程序实例,它是系统资源分配的基本单位。每个进程都拥有独立的内存空间和系统资源,可以看作是程序的一次执行过程。2.线程线程是进程中的执行单元,也被称为轻量级进程(LightWeightProcess)。一个进程可以包含多个线程,这些线程共享进......
  • java笔记分享(6)
    RandomRandom类        Random类位于java.util包下,Random类中实现的随机算法是伪随机,也就是有规则的随机。在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。        相同种子数的Random对象,相同次数......
  • 采用Java语言+开发工具 Idea+ scode数字化产科管理平台源码,产科管理新模式
    采用Java语言+开发工具Idea+scode数字化产科管理平台源码,产科管理新模式数字化产科管理系统是现代医疗信息化建设的重要组成部分,它利用现代信息技术手段,对孕产妇的孕期管理、分娩过程及产后康复等各个环节进行数字化、智能化管理,以提升医疗服务质量和效率;以下是对数字化......
  • 基于Java中的SSM框架实现野生动物公益保护系统项目【项目源码+论文说明】计算机毕业设
    基于Java中的SSM框架实现野生动物公益保护系统演示摘要本系统按照网站系统设计的基本流程,遵循系统开发生命周期法和结构化方法,基于Java语言设计并实现了野生动物公益保护系统。该系统基于浏览器/服务器模式,采用JSP技术,后台数据库系统选择MySQL数据库。系统分为前台和后台......
  • java 导出execl 文件实现动态列和列合并
    1.importorg.apache.poi.ss.usermodel.*;importorg.apache.poi.xssf.usermodel.XSSFWorkbook;第一步,判断有几列,放入list ,list一个一个判断,组装列 第二步,放数据的时候同样的逻辑,一列一列判断,放入数据  《2》实现列和行合并和列居中 4.main方法写到本地测试......