【问题标题】:import custom Windows event viewer logs form csv into sql table将自定义 Windows 事件查看器日志从 csv 导入 sql 表
【发布时间】:2016-02-21 20:46:12
【问题描述】:

我有一个 powershell 命令从远程 Windows 服务器获取事件查看器日志并将其放入 csv 文件中,然后显示它并将其添加到数据库(sql server)中

String command = "powershell.exe cd 'Path\\Output'; "
        + "$password = get-content 'Path\\Output\\"
        + serverClicked + "' | convertto-securestring; $username = 'administrator'; "
        + "$cred= New-Object System.Management.Automation.PSCredential($username, $password); "
        + "Invoke-Command -ComputerName " + serverClicked + " -Credential $cred -Authentication Default -ScriptBlock "
        + "{ Get-EventLog -LogName " + logName + " -EntryType " + entryType + " -Newest 50 | Select-Object -Property PSComputerName, TimeGenerated, EventID, Message, Source, EntryType}"
        + " | Out-File " + serverClicked + "." + logName + entryType + "." + curDate + ".csv; cat " + serverClicked + "." + logName + entryType + "." + curDate + ".csv";
System.out.println(command);

Process powerShellProcess;
powerShellProcess = Runtime.getRuntime().exec(command);
powerShellProcess.getOutputStream().close();
String line;
System.out.println("Output:");
BufferedReader stdout = new BufferedReader(new InputStreamReader(powerShellProcess.getInputStream()));
ShowInfoTextArea.setText("\n");

//------------------------------------
//Going to try adding the data to the database
DBConnect d = new DBConnect();
Connection con = d.getConnection();
Statement stmt = con.createStatement();
stmt.executeQuery("INSERT INTO EventViewer(TimeGenerated, EventID, Message, Source, EntryType, PSComputerName) VALUES ('" + timeGenerated + "', '" + eventID + "', '" + message + "', '" + source + "', '" + entryType2 + "', '" + pSComputerName + "');");
System.out.println("INSERT INTO EventViewer(TimeGenerated, EventID, Message, Source, EntryType, PSComputerName) VALUES ('" + timeGenerated + "', '" + eventID + "', '" + message + "', '" + source + "', '" + entryType2 + "', '" + pSComputerName + "');");
stmt.close();
stmt.close();
con.close();
//------------------------------------

此代码运行一个 powershell 命令并将输出放入一个 csv 文件,然后我需要将该输出放入数据库设置中的单独字段中:

[TimeGenerated] [varchar](50) NOT NULL,
[EventID] [varchar](50) NOT NULL,
[Message] [varchar](500) NOT NULL,
[Source] [varchar](50) NOT NULL,
[EntryType] [varchar](50) NOT NULL,
[PSComputerName] [varchar](50) NOT NULL,
[LogName] [varchar] (50) NOT NULL

要么我需要弄清楚 Java 以将其正确输入数据库,要么需要更好的方法。我面临的主要问题是事件的消息部分位于多行

提前感谢您的帮助

【问题讨论】:

    标签: java sql-server powershell windows-server-2012-r2 event-viewer


    【解决方案1】:

    我无法对此进行测试,但我可以看到您的输出行存在问题

    + " | Out-File " + serverClicked + "." + logName + entryType + "." + curDate + ".csv; cat " + serverClicked + "." + logName + entryType + "." + curDate + ".csv";
    

    Out-File 不会生成正确的 CSV,也可能会引入编码问题。此外,您似乎正在重新读取文件。如果是这种情况,我们可以完全跳过该步骤,只需使用 ConvertTo-CSV 即可处理您从 Get-EventLog 输出的对象。所以我会将command 的最后一行改为...

    + " |  ConvertTo-Csv -NoTypeInformation
    

    这应该可以为您提供所需内容的工作副本。如果我在正确的轨道上并且您仍然有问题,我需要您为我调试。

    【讨论】:

    • 非常感谢您回答这个问题。我将在一小时内检查并调试。再次感谢。
    • 这适用于修复未格式化的 csv 文件,我现在的主要问题是,我如何获取该 csv 并将字段输入到 sql 表中,我不介意重新创建该 sql 表,我只想在 sql 表中的每个事件。请帮我解决这个问题
    • 我已设法将数据转换为 CSV,然后转换为 SQL,但是,我无法让 PowerShell 将 LogName 添加到 csv。我正在运行这个命令:Invoke-Command -ComputerName Baron-Server -Credential $cred -Authentication Default -ScriptBlock { Get-EventLog -LogName System -EntryType Error | Select-Object -Property PSComputerName, Site,TimeGenerated, EventID, Message, Source, EntryType} | Export-Csv -NoTypeInformation -Path C:/output.csv
    猜你喜欢
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多