como criar Log do Sistema

pessoal segui o exemplo do site scriptcase para tentar criar um log do meu sistema o problema que o exemplo não deu certo aqui comigo, por isso gostaria de saber com vocês como fazer essa aplicação, segui os passos criei um banco de dados tb_log, criei uma aplicação form e criei a biblioteca conforme segue abaixo e depois criei um consulta em cima da tb_log e não deu certo não sei porque segue o código para vocês…me ajudem…

Biblioteca Log.php

<?php function Log($login,$desc){ $datahora = date("d-m-Y H:i:s"); $ip =$_SERVER["REMOTE_ADD"]; sc_exec_sql("insert into tb_log(data_hora, login_user, ip_user, descricao) values('$datahora','$login','$ip','$desc')" ); } ?>

depois Habilitei a Bilioteca

e criei o evento com onAfterInsert:
$desc = “INSERT”;
Log([login],$desc);

e não deu certo … me ajudem…

o exemplo do site funciona perfeito
aparentemente seu codigo esta certo

tentou fechar tudo gerar novamente tudo e ver se a biblioteca esta ativada

sim ativei a biblioteca em Programação/Bibliotecas e lá aparece a biblioteca pública clico nela e gero a aplicação e não funciona.Olha isso tudo fiz em uma aplicação do tipo formulário e depois criei uma aplicação do tipo consulta em cima do banco tb_log pra listar os logs e não deu certo.

Onilson, no meu caso modifiquei um pouquinho a estrutura, mas funciona também da forma do exemplo.
Estou usando assim:
//------Estrutura da tabela----------

CREATE TABLE IF NOT EXISTS tb_log (
id_log int(11) NOT NULL AUTO_INCREMENT,
log_apl varchar(100) DEFAULT NULL,
log_acao varchar(100) DEFAULT NULL,
log_user varchar(20) DEFAULT NULL,
log_ip varchar(20) DEFAULT NULL,
log_reg1 varchar(100) DEFAULT NULL,
log_reg2 varchar(100) DEFAULT NULL,
data_hora datetime DEFAULT NULL,
PRIMARY KEY (id_log)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

//----------------------------------

//-----biblioteca php----------

<?php Function log($loguser,$apl,$logreg1,$logreg2,$logacao) { $apl = basename ($apl ,".php"); // $arquivo = "aplicação" $logip = $_SERVER["REMOTE_ADDR"]; $data_hora = date('Y-m-d H:i:s'); sc_exec_sql("INSERT INTO tb_log (log_apl,log_acao,log_user,log_ip,log_reg1,log_reg2,data_hora) VALUES ('$apl', '$logacao', '$loguser', '$logip', '$logreg1','$logreg2', '$data_hora')"); } // Fim da Função de Log ?>

//-------------------------

//-----Para formulários-----

//----Evento onLoad----

$loguser = [var_login];
$apl = end(explode("/", $_SERVER[‘PHP_SELF’])); // nome da aplicação no sc
$campo = {idcliente}; // nome do campo a ser gravado (chave primaria por ex)
$campo2 = {nomecliente};

if (sc_btn_new)
{
$act = “Abriu Novo Cadastro de Cliente”;
log($loguser,$apl,$campo,$campo2,$act);
}

else {“Consultou Cadastro de Cliente”;
log($loguser,$apl,$campo,$campo2,$act);
}

//-------

//–Para Eventos onAfter—

// Formulários - eventos OnAfter - eu coloquei nos trÊs eventos Insert Update Delete
$loguser = [var_login];
$apl = end(explode("/", $_SERVER[‘PHP_SELF’]));
$campo = {idcliente};
$campo2 = {nomecliente};

$act = “Cadastrou Cliente”; //de acordo com o evento Ex. OnAfterInsert “Cadastrou Cliente” ou
//OnAfterUpdate “Atualizou Cliente” ou //OnAfterDelete “Excluiu Cliente”
log($loguser,$apl,$campo,$campo2,$act);

//-----------------

//----Fim formulários

//----Para grid/consulta–

//-- evento OnScriptInit
$loguser = [var_login];
$apl = end(explode("/", $_SERVER[‘PHP_SELF’]));
$campo = “-”;
$campo2 = “-”;
$act = “Consultou Lista de Clientes”;//os textos que serão gravados vc pode mudar
log($loguser,$apl,$campo,$campo2,$act);

//----fim grid/consulta

//—Para Controle-----

// Controle - evento OnValidate
$loguser = [var_login];
$apl = end(explode("/", $_SERVER[‘PHP_SELF’]));
$campo = “-”;
$campo2 = “-”;

if (sc_btn_ok) {
$act = “Efetuou login no sistema”;}
else {$act = “Desconhecida”;}
log($loguser,$apl,$campo,$campo2,$act);

//—fim controle

Lembrar de ativar a biblioteca em todas as aplicações

bom dia

fiz conforme o seu exemplo

so que na hora que eu clico para auterar um cliente na consulta
ele passa para o proximo registro

como eu posso resolver?

Pessoal,

Depois do lançamento da V6 estou sentindo que a demanda por LOGs cresceu bastante assim como a necessidade de compreender o funcionamento desta nova funcionalidade no SC… estou certo de que não existe BUG nesta funcionalidade, apenas carece de uma documentação melhor para que o entendimento seja mais fácil…

Desenvolvi, antes antes da V6 - desde que comecei a utilizar o SC - algumas rotinas de LOG, as quais venho aperfeiçoando durante o tenho e hoje as considero bastante maturadas… Já disse anteriormente e volto a repetir, não é melhor nem pior do que a do SC-V6, é minha, está maturada e é totalmente nativa - não farei comparações do tipo “o meu tem isso que esse ou aquele não tem” isso não vem ao caso.

O arquivo LOG é construído para auditar alguma coisa e existem muitos pontos de vista a serem focados. Uma auditoria totalmente eficaz (se é que existe isso) passa por pelo menos 3 camadas: servidor, banco de dados e aplicação. Então, nativamente, todo servidor (sistema operacional) e todo DB possuem estas ferramentas, cabe a nós reforçá-la, implementando na aplicação.

Na aplicação, temos dois focos: o acesso a aplicação e o manuseio (insert, update e delete) dos registros… e para contemplar de forma básica esses requisitos existe a necessidade de pelo menos os seguintes campos na tabela de LOGs:

a) aplicação (que está sendo acessada)
b) usuário (que está acessando/manipulando o registro)
c) data e hora (acesso/manipulação)
d) IP (origem do acesso)
e) Ação (Acesso/Consulta, Inclusão, Alteração ou Exclusão)
f) O que foi executado (campo do tipo TEXT ou LONGTEXT, dependendo do DB)

Todos os campos acima são de preenchimento obrigatório.

Algo mais poderá ser colocado aí… por exemplo: se sua aplicação é multi-empresa então é necessário um campo que informe a quem (qual empresa ou grupo de empresas) pertence o registro… e você pode dizer que o usuário já define isso - mas pode acontecer (e é normal) que um usuário pertença a mais de uma empresa. Outro exemplo: se você trabalha com registros binários (fotos) ou registros especias do tipo POLIGON terá necessidade de criar mais um campo ou uma nova tabela (detalhe - relacionamento).

Com base nisso, o que se precisa fazer agora:

a) Se você é expert no assunto, poderá criar apenas uma função (a ser guardada na biblioteca pública - que poderá ser utilizada em todos os seus projetos) que trate essas informações e grave no registro de LOGs… caso você não seja tão expert assim, aconselho que você crie pelo menos 3 funções: uma de simples acesso, uma de Inclusão e Deleção e outra de Alteração (esta mais completa de todas, uma vez que terá que analisar o registro antes da alteração e após a alteração). As 3 funções gravando em apenas uma tabela de LOGs.

b) Na app login (inicial), no evento onValidate utilize a função de simples acesso para informar que o usuário se logou;

c) Na app menu, no evento onExecute utilize a função de simples acesso para informar que o usuário acessou tal aplicação;

d) Em todas as apps do tipo FORM:
1) nos eventos onAfterInsert (após a inclusão) e onBeforeDelete (antes da exclusão) execute a função de Inclusão e Deleção informando todos os campos e dados do registro que foram incluídos/excluídos
2) no evento onBeforeUpdate (antes da alteração) execute o sc_lookup no registro, para verificar como era o registro antes da alteração
3) no evento onAfterUpdate (após a alteração) execute o sc_lookup no registro, para verificar como é o registro após a alteração - compare as duas situações e grave apenas o campo(s) que foi(ram) alterados, informando a situação anterior e posterior;

e) Na saída da aplicação crie uma aplicação blank apenas para registrar a saída do sistema do usuário.

Basicamente é isso que o registro de logs vai fazer.

Você poderá ampliar essa concepção básica criando logs para as consultas - isso normalmente é inócuo, uma vez que se o usuário tem acesso a tal registro (através das permissões que foram dadas a ele) e ele não fez nenhuma alteração nos registros consultados então para que ficar registrando que ele consultou o registro? Se essa permissão já foi dada… Mas fica ao gosto do cliente.

De um modo geral é assim que as coisas se comportam.

Tenho ajudado alguns companheiros deste forum na construção e entendimento desses LOGs… e não cobro nada por isso! Faço pelo prazer de ver que todos estão caminhando numa direção boa e saber que amanhã ou depois essa pessoa beneficiada possa compartilhar também os seus conhecimentos/experiências/expertises aqui no Forum… Afinal todos temos muito a aprender…

Se as considerações acima não foram suficientes para o entendimento de como a coisa funciona, afinal de contas fui extremamente superficial - me preocupei apenas em informar a lógica da coisa - poderei ajudar mais um pouco fazendo um passo-a-passo (em forma de vídeo aulas) mais detalhado dessas ações, inclusive distribuindo um projeto exemplo para que vocês vejam como a coisa se comporta na prática… agora postarei apenas no site da associação que estamos pretendendo criar (www.auscriptcase.com.br).

Quem se interessar se cadastre no site da associação e envie email em pvt para mim (jovitomelo@hotmail.com).

Abraço a todos.