Пакетный файл для мониторинга каталога файлов журнала и отправки уведомлений по электронной почте при возникновении изменений?

Я хочу создать пакетный файл, который можно было бы разместить на сервере и запускать его через планировщик заданий ежедневно для мониторинга каталога файла журнала приложения. При изменении имени файла журнала (например, появляется журнал ошибок) пакет отправляет электронное письмо администратору или группе администраторов.

Каким будет общий сценарий для этого типа партии?

Спасибо.


person user3293057    schedule 19.02.2014    source источник
comment
Легкий пакетный скрипт, но я в основном искал наиболее эффективный язык сценариев.   -  person user3293057    schedule 21.02.2014


Ответы (2)


Я бы использовал для этого vbscript, так как он имеет встроенную возможность. Вот сценарий общего назначения, который вы можете изменить, чтобы делать то, что вы хотите. Вызовите его с помощью cscript в планировщике заданий.

MonitorFolder()

Function MonitorFolder()
intInterval = "2"
strDrive = "C:" 
strFolder = "\\temp\\"
strComputer = "." 
Set objWMIService = GetObject( "winmgmts:" & _ 
    "{impersonationLevel=impersonate}!\\" & _ 
    strComputer & "\root\cimv2" )
strQuery =  _
    "Select * From __InstanceOperationEvent" _
    & " Within " & intInterval _
    & " Where Targetinstance Isa 'CIM_DataFile'" _
    & " And TargetInstance.Drive='" & strDrive & "'" _
    & " And TargetInstance.Path='" & strFolder & "'"
Set colEvents = objWMIService.ExecNotificationQuery (strQuery) 
WScript.Echo "Monitoring events...[Ctl-C] to end"
Do 

    Set objEvent = colEvents.NextEvent()
    Set objTargetInst = objEvent.TargetInstance

    Select Case objEvent.Path_.Class 
        Case "__InstanceCreationEvent" 
            WScript.Echo "Created: " & objTargetInst.Name
            SendEmail "[email protected]", "[email protected]","Log File Created", "A new error log has appeared"
        Case "__InstanceDeletionEvent" 
            WScript.Echo "Deleted: " & objTargetInst.Name 
        Case "__InstanceModificationEvent" 
            WScript.Echo "Modified: " & objTargetInst.Name
    End Select 
Loop
End Function

Sub SendEmail(sFrom, sTo, sSubject, sMessageBody)
    Set objMessage = CreateObject("CDO.Message") 
    objMessage.Subject = sSubject 
    objMessage.From = sFrom 
    objMessage.To = sTo
    objMessage.TextBody = sMessageBody
    objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 
    objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.myserver.com"
    objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 
    objMessage.Configuration.Fields.Update
    objMessage.Send
end sub
person Matt Williamson    schedule 20.02.2014
comment
Спасибо, Мэтт. это должно дать мне довольно хорошую отправную точку. - person user3293057; 21.02.2014

Вот кусок кода из моего проекта для отслеживания изменений журнала

Оно использует

  • java nio для отслеживания изменений файла журнала
  • sigar api(https://github.com/hyperic/sigar) для получения идентификатора процесса, который будет использоваться за остановку службы
  • java mail для отправки почты в случае алерта (метод sendMail)

dll или около того файл должен быть добавлен к пути сборки, чтобы использовать sigar api

void initializePathAndWatcher(String directoryPath, String directoryName, Map<String, Object> data)
        throws IOException {
    yamlData = data;
    Sigar sigar = new Sigar();
    long pid = sigar.getPid();
    log.debug("Pid for current process: [" + pid + "]");
    path = Paths.get(directoryPath, directoryName);
    log.debug("Directory being watched: [" + path.toAbsolutePath() + "]");
    watcher = FileSystems.getDefault().newWatchService();
    path.register(watcher, ENTRY_CREATE, ENTRY_MODIFY);
    sigar.close();
}

void watcherServiceShutDown() throws IOException {
    watcher.close();
}

void trackEvent() throws Exception {
    try {
        while (true) {
            WatchKey watchKey;
            watchKey = watcher.take();
            for (WatchEvent<?> event : watchKey.pollEvents()) {
                WatchEvent.Kind<?> kind = event.kind();
                @SuppressWarnings("unchecked")
                WatchEvent<Path> ev = (WatchEvent<Path>) event;
                Path fileName = ev.context();
                if (fileName.toString().equals(yamlData.get("directory.filename").toString())) {
                    log.debug(kind.name() + ": [" + fileName + "]");
                    StringBuilder absoluteFilePath = new StringBuilder(path.toString());
                    absoluteFilePath.append("/");
                    absoluteFilePath.append(fileName);
                    Path filePath = Paths.get(absoluteFilePath.toString());
                    long lineCount = Files.lines(filePath).count();
                    Boolean flagMatchFound = false;
                    if (statusFlag.equalsIgnoreCase("WARN")) {
                        flagMatchFound = Files.lines(filePath).skip(linePointer).filter(s -> !s.isEmpty())
                                .anyMatch(s -> s.contains(yamlData.get("success.keyword").toString()));
                        if (flagMatchFound.equals(true)) {
                            log.warn("Bing server is back to normal");
                            statusFlag = "SUCCESS";
                            sendMail((String) yamlData.get("mail.success.subject"),
                                    (String) yamlData.get("mail.success.body"));
                        }
                    }
                    if (statusFlag.equalsIgnoreCase("SUCCESS")) {
                        flagMatchFound = Files.lines(filePath).skip(linePointer).filter(s -> !s.isEmpty())
                                .anyMatch(s -> s.contains(yamlData.get("error.keyword").toString()));
                        if (flagMatchFound.equals(true)) {
                            log.warn("Problem diagnosed on bing server");
                            statusFlag = "WARN";
                            sendMail((String) yamlData.get("mail.warn.subject"),
                                    (String) yamlData.get("mail.warn.body"));
                        }
                    }
                    linePointer = lineCount;
                    log.debug("Count of lines already processed active file: [" + linePointer + "]");
                }
            }
            watchKey.reset();
        }
    }
    catch(Exception e)
    {
        throw new Exception("Error occoured in trackEvent", e);
    }
    finally {
        watcher.close();
    }
}
person ericdemo07    schedule 14.03.2016