Sfoglia il codice sorgente

change IVSysMan add log stdout. Test OK.

yuchuli 3 anni fa
parent
commit
0080f87d76

+ 1 - 1
src/common/modulecomm/shm/procsm.cpp

@@ -63,7 +63,7 @@ void procsm::threadAttachMon()
         nCount++;
         if(nCount>300)
         {
-            std::cout<<"\033[1m\033[31m"<<" modulecomm msg "<<mstrsmname<<" Attach Fail."<<" Now Exit."<<"\033[0m"<<std::endl;
+            std::cerr<<"\033[1m\033[31m"<<" modulecomm msg "<<mstrsmname<<" Attach Fail."<<" Now Exit."<<"\033[0m"<<std::endl;
             std::this_thread::sleep_for(std::chrono::milliseconds(10));
             exit(-1);
         }

+ 6 - 0
src/tool/IVSysMan/IVSysMan.pro

@@ -75,3 +75,9 @@ FORMS += \
 
 RESOURCES += \
     ivsysman.qrc
+
+contains(QMAKE_HOST.os, Windows){
+    DEFINES += OS_WIN
+}else{
+    DEFINES +=  OS_UNIX
+}

+ 6 - 0
src/tool/IVSysMan/centerview.cpp

@@ -17,6 +17,7 @@ CenterView::CenterView(QTabWidget * pTab,ProgMon * pPM)
         gu->mpPM = mpPM;
         gu->CreateView();
         connect(gu,SIGNAL(ProgClick(ProgUnit*,ProgramViewUnit *,bool)),this,SLOT(onProgClick(ProgUnit*,ProgramViewUnit *,bool)));
+        connect(gu,SIGNAL(ProgLogClick(ProgUnit*,ProgramViewUnit *,bool)),this,SLOT(onProgLogClick(ProgUnit*,ProgramViewUnit *,bool)));
         mvectorGropup.push_back(gu);
     }
 }
@@ -107,6 +108,11 @@ void CenterView::onProgClick(ProgUnit * pu,ProgramViewUnit * pvu,bool bClick)
     emit ProgClick(pu,pvu,bClick);
 }
 
+void CenterView::onProgLogClick(ProgUnit * pu,ProgramViewUnit * pvu,bool bClick)
+{
+    emit ProgLogClick(pu,pvu,bClick);
+}
+
 void CenterView::ProcStarted(ProgUnit *pu)
 {
     int i;

+ 2 - 0
src/tool/IVSysMan/centerview.h

@@ -28,9 +28,11 @@ private:
 
 private slots:
     void onProgClick(ProgUnit * pu,ProgramViewUnit * pvu,bool bClick);
+    void onProgLogClick(ProgUnit * pu,ProgramViewUnit * pvu,bool bClick);
 
 signals:
     void ProgClick(ProgUnit *, ProgramViewUnit * ,bool);
+    void ProgLogClick(ProgUnit *, ProgramViewUnit * ,bool);
 
 public:
     /* Processs Started  Update view if need */

+ 12 - 0
src/tool/IVSysMan/groupunit.cpp

@@ -18,6 +18,7 @@ void GroupUnit ::CreateView()
         {
             ProgramViewUnit * pvu = new ProgramViewUnit(mpGroup,pu,30,80+j*50);
             connect(pvu,SIGNAL(progclick(ProgUnit*,ProgramViewUnit * ,bool)),this,SLOT(onProgClick(ProgUnit*,ProgramViewUnit * ,bool)));
+            connect(pvu,SIGNAL(ProgLogClick(ProgUnit*,ProgramViewUnit*,bool)),this,SLOT(onProgLogClick(ProgUnit*,ProgramViewUnit * ,bool)));
             mvectorProgramViewUnit.push_back(pvu);
             j++;
         }
@@ -47,6 +48,7 @@ void GroupUnit::ReCreateView()
         {
             ProgramViewUnit * pvu = new ProgramViewUnit(mpGroup,pu,30,80+j*50);
             connect(pvu,SIGNAL(progclick(ProgUnit*,ProgramViewUnit * ,bool)),this,SLOT(onProgClick(ProgUnit*,ProgramViewUnit * ,bool)));
+            connect(pvu,SIGNAL(ProgLogClick(ProgUnit*,ProgramViewUnit*,bool)),this,SLOT(onProgLogClick(ProgUnit*,ProgramViewUnit * ,bool)));
             mvectorProgramViewUnit.push_back(pvu);
             j++;
 
@@ -60,6 +62,11 @@ void GroupUnit::onProgClick(ProgUnit *pu, ProgramViewUnit * pvu,bool bClick)
     emit ProgClick(pu,pvu,bClick);
 }
 
+void GroupUnit::onProgLogClick(ProgUnit *pu, ProgramViewUnit *pvu, bool bClick)
+{
+    emit ProgLogClick(pu,pvu,bClick);
+}
+
 void GroupUnit::ProcStarted(ProgUnit *pu)
 {
     int i;
@@ -138,5 +145,10 @@ void GroupUnit::CreateTitle()
     pLA->setGeometry(nXPos,nYPos,90,nHgt);
     nXPos = nXPos + 100;
 
+    pLA = new QLabel(mpGroup);
+    pLA->setText("log(stdout)");
+    pLA->setGeometry(nXPos,nYPos,90,nHgt);
+    nXPos = nXPos + 100;
+
 
 }

+ 3 - 0
src/tool/IVSysMan/groupunit.h

@@ -31,9 +31,12 @@ public:
 
 private slots:
     void onProgClick(ProgUnit * pu,ProgramViewUnit * pvu,bool bClick);
+    void onProgLogClick(ProgUnit * pu,ProgramViewUnit * pvu,bool bClick);
+
 
 signals:
     void ProgClick(ProgUnit *,ProgramViewUnit * , bool);
+    void ProgLogClick(ProgUnit *,ProgramViewUnit * , bool);
 
 public:
     /* Processs Started  Update view if need */

+ 6 - 2
src/tool/IVSysMan/mainwindow.cpp

@@ -56,8 +56,6 @@ MainWindow::MainWindow(QWidget *parent) :
 {
     ui->setupUi(this);
 
-    std::cerr<<"hello error."<<std::endl;
-
     //从配置文件中读取当前系统包含的所有模块信息-tjc
     mPM = new ProgMon(gstrxmlpath.data());
 
@@ -75,6 +73,7 @@ MainWindow::MainWindow(QWidget *parent) :
     mpCV = pcv;
 
     connect(pcv,SIGNAL(ProgClick(ProgUnit*,ProgramViewUnit * ,bool)),this,SLOT(onProgClick(ProgUnit*,ProgramViewUnit * ,bool)));
+    connect(pcv,SIGNAL(ProgLogClick(ProgUnit*,ProgramViewUnit*,bool)),this,SLOT(onProgLogClick(ProgUnit*,ProgramViewUnit*,bool)));
 
 //    QString path = getenv("HOME");
 //    path = path + "/qt/bq/deploy/app/IVSysMan.xml";
@@ -216,6 +215,11 @@ void MainWindow::onProgClick(ProgUnit *pu,ProgramViewUnit * pvu, bool bClick)
     }
 }
 
+void MainWindow::onProgLogClick(ProgUnit *pu, ProgramViewUnit *pvu, bool bClick)
+{
+    pu->mbSavestdout = bClick;
+}
+
 void MainWindow::onProcessStarted(ProgUnit *pu)
 {
     mpCV->ProcStarted(pu);

+ 2 - 0
src/tool/IVSysMan/mainwindow.h

@@ -44,6 +44,8 @@ private:
 private slots:
 
      void onProgClick(ProgUnit * pu,ProgramViewUnit * pvu,bool bClick);
+     void onProgLogClick(ProgUnit * pu,ProgramViewUnit * pvu,bool bClick);
+
 
 private slots:
     void onProcessStarted(ProgUnit * pu);

+ 264 - 10
src/tool/IVSysMan/progmon.cpp

@@ -3,17 +3,61 @@
 
 #include <iostream>
 
+#ifdef OS_UNIX
+#include "sys/statfs.h"
+#endif
+
+
+#ifdef  OS_WIN
+#include  <windows.h>
+
+#endif
+
 extern iv::Ivlog * ivlog;
 extern iv::Ivfault * ivfault;
 
 ProgMon::ProgMon(std::string path)
 {
     mvectorprog = loadprogunit(path);
+
+    InitLog();
+
+    mpthread_stdout = new std::thread(&ProgMon::threadstdout,this);
 }
 
 ProgMon::~ProgMon()
 {
-    int i;
+    mbstdoutrun = false;
+    mpthread_stdout->join();
+
+    if(mbFileStdLog)
+    {
+        mbFileStdLog = false;
+        qint64 nsize = mFileStdLog.size();
+        mFileStdLog.close();
+
+        if(nsize == 0)
+        {
+            std::cout<<"Because no std log, delete std log. "<<std::endl;
+            mFileStdLog.remove();
+        }
+
+    }
+
+    if(mbFileLog)
+    {
+        mbFileLog = false;
+        qint64 nsize = mFileLog.size();
+        mFileLog.close();
+
+        if(nsize == 0)
+        {
+            std::cout<<"Because no error log, delete error log. "<<std::endl;
+            mFileLog.remove();
+        }
+
+    }
+    unsigned int i;
     for(i=0;i<mvectorprog.size();i++)
     {
         if(mvectorprog[i].mProcess != 0)
@@ -237,15 +281,33 @@ void ProgMon::onProcessErrorStarted(QProcess::ProcessError error){
 void ProgMon::onReadStandardOutput()
 {
     QProcess * proc = (QProcess *)sender();
-    QByteArray ba = proc->readAll();
-    qDebug("process out: %s ",ba.data());
+    QByteArray ba = proc->readAllStandardOutput();
+
+
+    if(mbAllNoLog == false)
+    {
+        mMutex_stdout.lock();
+        if(mvectorstdout.size()<1000) mvectorstdout.push_back(stdoutunit(proc,ba));
+        mMutex_stdout.unlock();
+    }
+//    qDebug("process out: %s ",ba.data());
 }
 
 void ProgMon::onReadStandardError()
 {
     QProcess * proc = (QProcess *)sender();
-    QByteArray ba = proc->readAll();
-    qDebug("process error: %s ",ba.data());
+    QByteArray ba = proc->readAllStandardError();
+
+    if(ba.size() == 0)return;
+    LogError(proc,ba);
+
+//    if(mbAllNoLog == false)
+//    {
+//        mMutex_stdout.lock();
+//        if(mvectorstdout.size()<1000) mvectorstdout.push_back(stdoutunit(proc,ba));
+//        mMutex_stdout.unlock();
+//    }
+//    qDebug("process error: %s ",ba.data());
 }
 
 void ProgMon::onProcessEnd()
@@ -323,7 +385,9 @@ void ProgMon::onChRead()
     QProcess * proc = (QProcess *)sender();
     QByteArray ba = proc->readAll();
 
-    if(proc->currentReadChannel() == 1)
+    int ncha = proc->currentWriteChannel();
+
+    if(proc->currentWriteChannel() == 1)
     {
         std::cout<<"Receive a Error Output."<<std::endl;
         LogError(proc,ba);
@@ -332,7 +396,7 @@ void ProgMon::onChRead()
 
 
 #ifdef QT_DEBUG
-    qDebug("process INFO: %s ", ba.data());
+//    qDebug("process INFO: %s ", ba.data());
 #endif
 
     if(mbAllNoLog == false)
@@ -433,12 +497,13 @@ void ProgMon::StartProc(ProgUnit *pu)
 
     connect(pu->mProcess,SIGNAL(started()),this,SLOT(onProcessStarted()));
     connect(pu->mProcess,SIGNAL(finished(int)),this,SLOT(onProcessEnd()));
-    connect(pu->mProcess,SIGNAL(readyRead()),this,SLOT(onChRead()));
- //   connect(pu->mProcess,SIGNAL(readyReadStandardOutput()),this,SLOT(onReadStandardOutput()));
+//    connect(pu->mProcess,SIGNAL(readyRead()),this,SLOT(onChRead()));
+    connect(pu->mProcess,SIGNAL(readyReadStandardOutput()),this,SLOT(onReadStandardOutput()));
+    connect(pu->mProcess,SIGNAL(readyReadStandardError()),this,SLOT(onReadStandardError()));
 
 
     connect(pu->mProcess,SIGNAL(error(QProcess::ProcessError)),this,SLOT(onProcessErrorStarted(QProcess::ProcessError)));
-//    connect(pu->mProcess,SIGNAL(readyReadStandardError()),this,SLOT(onReadStandardError()));
+
 
 
     pu->mProcess->start(pu->strcmd.data());
@@ -595,6 +660,12 @@ void ProgMon::setquit()
 void ProgMon::threadstdout()
 {
 
+    QString strhomepath = getenv("HOME");
+
+    int nNeedCheckSpace = 0;
+
+    bool bHaveHDDSpace = true;
+
     while(mbstdoutrun)
     {
         bool bAllNoLog = true;
@@ -639,13 +710,196 @@ void ProgMon::threadstdout()
         else
         {
 
+            if(bHaveHDDSpace == false)
+            {
+                continue;
+            }
+            for(i=0;i<xvectorstdout.size();i++)
+            {
+                unsigned int j;
+                std::string strappname;
+                std::string strarg;
+                bool bFind = false;
+                bool bSave = false;
+                mMutex.lock();
+                for(j=0;j<mvectorprog.size();j++)
+                {
+                    ProgUnit *pu = &(mvectorprog.at(j));
+                    if(xvectorstdout[i].mpProc == pu->mProcess)
+                    {
+                        strappname =  pu->strappname;
+                        strarg = pu->strargs;
+                        bFind = true;
+                        bSave = pu->mbSavestdout;
+                        break;
+                    }
+                }
+                mMutex.unlock();
+
+                if(bFind)
+                {
+                    if(bSave)
+                    {
+                        if(nNeedCheckSpace <= 0)
+                        {
+ //                           std::cout<<"check space."<<std::endl;
+                            nNeedCheckSpace = 1000;
+                            int nSpace = get_path_availspace(strhomepath);
+
+ //                           std::cout<<"hard space is "<<nSpace<<" MB."<<std::endl;
+                            if(nSpace<100)
+                            {
+                                std::cout<<"Hard Disk No space to save std log."<<std::endl;
+                                bHaveHDDSpace = false;
+                            }
+                        }
+                        nNeedCheckSpace--;
+                        if(bHaveHDDSpace)
+                        {
+                            QString strlog;
+                            strlog = QDateTime::currentDateTime().toString("(yyyy/MM/dd hh:mm:ss:zzz")
+                                    + " | " + strappname.data() + " "+ strarg.data() + " "+") "
+                                    +xvectorstdout[i].mba.data();
+                            WriteStdLog(strlog.toLatin1().data());
+                        }
+                    }
+                }
+                else
+                {
+                    std::cout<<"not found a std out 's process."<<std::endl;
+                }
+            }
+
         }
     }
+
+    std::cout<<"threadstdout complete."<<std::endl;
 }
 
 void ProgMon::LogError(QProcess *proc, QByteArray &ba)
 {
+    std::cout<<"error is "<<ba.data()<<std::endl;
+
+    unsigned int i;
+    std::string strappname;
+    std::string strarg;
+    bool bFind = false;
+    mMutex.lock();
+    for(i=0;i<mvectorprog.size();i++)
+    {
+        ProgUnit *pu = &(mvectorprog.at(i));
+        if(proc == pu->mProcess)
+        {
+            strappname =  pu->strappname;
+            strarg = pu->strargs;
+            bFind = true;
+            break;
+        }
+    }
+    mMutex.unlock();
+
+    if(bFind)
+    {
+        QString strlog;
+        strlog = QDateTime::currentDateTime().toString("yyyy/MM/dd hh:mm:ss:zzz")
+                + " | " + strappname.data() + " "+ strarg.data() + " "+" | Error: "
+                +ba.data() + "\n";
+        WriteLog(strlog.toLatin1().data());
+    }
+
+}
+
+void ProgMon::InitLog()
+{
+    QString strpath = getenv("HOME");
+
+    strpath = strpath + "/log";
+    QDir xDir(strpath);
+    if(xDir.exists() == false)
+    {
+        std::cout<<"dir "<<strpath.toLatin1().data()<<" not exist . Create it."<<std::endl;
+        if(xDir.mkdir(strpath) == false)
+        {
+            std::cout<<"make dir faile . dir is "<<strpath.toLatin1().data()<<std::endl;
+            mbFileLog = false;
+            return;
+        }
+    }
+
+    QString strname = "IVSysMan-errlog-" + QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz.log");
+    QString strstdname = "IVSysMan-stdlog-" + QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz.log");
+    QString strstdpath = strpath + "/" + strstdname;
+    strpath = strpath +"/" + strname;
+
+    mFileLog.setFileName(strpath);
+
+    if(mFileLog.open(QIODevice::ReadWrite))
+    {
+        mbFileLog = true;
+    }
+    else
+    {
+        std::cout<<" Create error log File Fail. File Path is "<<strpath.toLatin1().data()<<std::endl;
+        mbFileLog = false;
+    }
+
+
+
+
+    mFileStdLog.setFileName(strstdpath);
+
+    if(mFileStdLog.open(QIODevice::ReadWrite))
+    {
+        mbFileStdLog = true;
+    }
+    else
+    {
+        std::cout<<" Create std log File Fail. File Path is "<<strpath.toLatin1().data()<<std::endl;
+        mbFileStdLog = false;
+    }
+
+}
+
+void ProgMon::WriteLog(const char *strlog)
+{
+    if(mbFileLog)
+    {
+        mFileLog.write(strlog,strnlen(strlog,100000));
+        mFileLog.flush();
+    }
+}
+
 
+void  ProgMon::WriteStdLog(const char *strlog)
+{
+    if(mbFileStdLog)
+    {
+        mFileStdLog.write(strlog,strnlen(strlog,100000));
+    }
 }
 
+int ProgMon::get_path_availspace(const QString & path)
+{
+#ifdef OS_UNIX
+    struct statfs diskInfo;
+    statfs(path.toUtf8().data(), &diskInfo);
+
+    qDebug("%s 总大小:%.0lfMB 可用大小:%.0lfMB",path.toStdString().c_str(),(diskInfo.f_blocks * diskInfo.f_bsize)/1024.0/1024.0,(diskInfo.f_bavail * diskInfo.f_bsize)/1024.0/1024.0);
+    return (diskInfo.f_bavail * diskInfo.f_bsize)/1024.0/1024.0;
+#endif
+
+#ifdef OS_WIN
+    LPCWSTR lpcwstrDriver=(LPCWSTR)path.utf16();
+
+        ULARGE_INTEGER liFreeBytesAvailable, liTotalBytes, liTotalFreeBytes;
+
+        if( !GetDiskFreeSpaceEx( lpcwstrDriver, &liFreeBytesAvailable, &liTotalBytes, &liTotalFreeBytes) )
+        {
+            qDebug() << "ERROR: Call to GetDiskFreeSpaceEx() failed.";
+            return 0;
+        }
+        return (quint64) liTotalFreeBytes.QuadPart/1024/1024;
+
+#endif
+}
 

+ 17 - 0
src/tool/IVSysMan/progmon.h

@@ -3,6 +3,7 @@
 
 #include <string>
 #include <vector>
+#include <thread>
 
 #include <QProcess>
 
@@ -112,8 +113,24 @@ private:
 
     bool mbAllNoLog = true;
 
+    std::thread * mpthread_stdout;
+
 private:
     void LogError(QProcess * proc,QByteArray & ba);
+
+    QFile mFileLog;
+    bool mbFileLog = false;
+    void InitLog();
+
+    void WriteLog(const char * strlog);
+
+    QFile mFileStdLog;
+    bool mbFileStdLog = false;
+
+    void WriteStdLog(const char * strlog);
+
+    int get_path_availspace(const QString & path);
+
 };
 
 #endif // PROGMON_H

+ 14 - 1
src/tool/IVSysMan/programviewunit.cpp

@@ -58,6 +58,12 @@ ProgramViewUnit::ProgramViewUnit(QGroupBox * pGroup,ProgUnit * pu, int x,int y)
     nXPos = nXPos + 100;
     mpLEThread = pLE;
 
+    pswitch = new SwitchButton(pGroup);
+    pswitch->setGeometry(nXPos,y,90,nHgt);
+    nXPos = nXPos + 100;
+    pswitch->setChecked(false);
+    mpLogStd = pswitch;
+
     mPU = pu;
 
     if(pu->mbRun)
@@ -65,11 +71,13 @@ ProgramViewUnit::ProgramViewUnit(QGroupBox * pGroup,ProgUnit * pu, int x,int y)
         pswitch->setChecked(true);
     }
 
-    connect(pswitch,SIGNAL(clicked(bool)),this,SLOT(onSwitchClick(bool)));
+    connect(mpSwich,SIGNAL(clicked(bool)),this,SLOT(onSwitchClick(bool)));
+    connect(mpLogStd,SIGNAL(clicked(bool)),this,SLOT(onLogSwitchClick(bool)));
 }
 
 ProgramViewUnit::~ProgramViewUnit()
 {
+    delete mpLogStd;
     delete mpLabelName;
     delete mpSwich;
     delete mpLEArgs;
@@ -86,6 +94,11 @@ void ProgramViewUnit::onSwitchClick(bool bClick)
 
 }
 
+void ProgramViewUnit::onLogSwitchClick(bool bClick)
+{
+    emit ProgLogClick(mPU,this,bClick);
+}
+
 void ProgramViewUnit::ProcStarted(ProgUnit *pu)
 {
     if(pu == mPU)

+ 5 - 0
src/tool/IVSysMan/programviewunit.h

@@ -33,15 +33,20 @@ public:
     QLineEdit * mpLEMem;
     /* Module Thread Number */
     QLineEdit * mpLEThread;
+    /* Module Log std Switch */
+    SwitchButton * mpLogStd;
 
 
 
 private slots:
     void onSwitchClick(bool bClick);
+    void onLogSwitchClick(bool bClick);
 
 signals:
     void progclick(ProgUnit *,ProgramViewUnit * , bool);
 
+    void ProgLogClick(ProgUnit * ,ProgramViewUnit * ,bool);
+
 private:
     ProgUnit * mPU;
 

+ 0 - 2
src/tool/IVSysMan/progunit.h

@@ -50,8 +50,6 @@ public:
     QTime timeRec;//当前时间
     int count;//次数
 
-    std::vector<QByteArray> mvectorstdout;
-
     bool mbSavestdout = false;